2016-10-15 3 views
6

私はretroditを使用してRedditのAndroidクライアントを作成しています。 tokeを取得するlogcatはうまく動作しますが、ログインユーザーの情報を取得しようとすると「404 Not Found」が表示されます。ここで Android Retrofit2 reddit 404が見つかりません

D/OkHttp: --> POST https://oauth.reddit.com/api/v1/me http/1.1 
D/OkHttp: Content-Length: 0 
D/OkHttp: Authorization: bearer myToken 
D/OkHttp: User-Agent: MyRedditClient/0.1 by myusername 
D/OkHttp: --> END POST 
D/OkHttp: <-- 404 Not Found https://oauth.reddit.com/api/v1/me (677ms) 

は私のコードです:

import java.io.IOException; 

import okhttp3.Interceptor; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class ServiceAuthGenerator { 

    public static final String API_BASE_URL = "https://www.reddit.com/"; 

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(API_BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    public static <S> S getTokenService(Class<S> serviceClass) { 
     return getTokenService(serviceClass, null, null); 
    } 

    public static <S> S getTokenService(Class<S> serviceClass, String username, String password) { 
     if (username != null && password != null) { 
      String credentials = username + ":" + password; 
      final String basic = 
        "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 

      httpClient.addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Interceptor.Chain chain) throws IOException { 
        Request original = chain.request(); 

        Request.Builder requestBuilder = original.newBuilder() 
          .header("Authorization", basic) 
          .header("Accept", "application/json") 
          .method(original.method(), original.body()); 

        Request request = requestBuilder.build(); 
        return chain.proceed(request); 
       } 
      }); 
     } 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     OkHttpClient client = httpClient.addInterceptor(interceptor).build(); 
     Retrofit retrofit = builder.client(client).build(); 
     return retrofit.create(serviceClass); 
    } 

} 

import java.io.IOException; 

import okhttp3.Interceptor; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class ServiceInfoGenerator { 

    public static final String API_BASE_URL = "https://oauth.reddit.com/"; 

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(API_BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    public static <S> S retrieveInfoService(Class<S> serviceClass) { 
     return retrieveInfoService(serviceClass, null, null); 
    } 

    public static <S> S retrieveInfoService(Class<S> serviceClass, final String authToken, final String username) { 
     if (authToken != null && username != null) { 
      httpClient.addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request original = chain.request(); 

        // Request customization: add request headers 
        Request.Builder requestBuilder = original.newBuilder() 
          .header("Authorization", " bearer "+authToken) 
          .header("User-Agent", "MyRedditClient/0.1 by "+username) 
          .method(original.method(), original.body()); 

        Request request = requestBuilder.build(); 
        return chain.proceed(request); 
       } 
      }); 
     } 

     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); 

     OkHttpClient client = httpClient.addInterceptor(interceptor).build(); 
     try { 
      client.interceptors().add(new UserAgentInterceptor(username)); 
     } catch (Exception e){ 
      Log.i("ServiceInfoGenerator", "retrieveInfoService: "+e.getMessage()); 
     } 
     Retrofit retrofit = builder.client(client).build(); 
     return retrofit.create(serviceClass); 
    } 
} 

import java.util.Map; 

import retrofit2.Call; 
import retrofit2.http.Field; 
import retrofit2.http.FormUrlEncoded; 
import retrofit2.http.GET; 
import retrofit2.http.Headers; 
import retrofit2.http.POST; 
import retrofit2.http.QueryMap; 

public interface MyApiRetrofit { 

    @POST("/api/v1/access_token") 
    @FormUrlEncoded 
    Call<Authorize> accessToken(@Field(("grant_type")) String grantType, @Field(("username")) String username, @Field(("password")) String password); 

    @POST("/api/v1/me") 
    Call<Authorize> retrieveMyInfo(); 

} 

import android.os.AsyncTask; 
import android.util.Log; 

import com.havistudio.myreddit.api.Authorize; 
import com.havistudio.myreddit.api.MyApiRetrofit; 

import java.io.IOException; 

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

public class TestAPITask2 extends AsyncTask<Void, Void, Void> { 

    private static final String TAG = "TestAPITask2"; 
    private String myAccessToken; 
    private String myRefreshToken; 

    @Override 
    protected Void doInBackground(Void... voids) { 

     MyApiRetrofit loginService = ServiceAuthGenerator.getTokenService(MyApiRetrofit.class, "client_id", "client_secret"); 
     Call<Authorize> call = loginService.accessToken("password", "myusername", "mypassword"); 
     call.enqueue(new Callback<Authorize>() { 
      @Override 
      public void onResponse(Call<Authorize> call, Response<Authorize> response) { 
       if (response.isSuccessful()) { 
        // user object available 
        Log.i(TAG, "isSuccessful"); 
        Authorize temp = response.body(); 
        myAccessToken = temp.getAccessToken(); 
        Log.i(TAG, temp.toString()); 

        MyApiRetrofit myInfoService = ServiceInfoGenerator.retrieveInfoService(MyApiRetrofit.class, myAccessToken, "myusername"); 
        Call<Authorize> call2 = myInfoService.retrieveMyInfo(); 
        try { 
         Authorize user = call2.execute().body(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

       } else { 
        // error response, no access to resource? 
        Log.i(TAG, "error response"); 
       } 
      } 

      @Override 
      public void onFailure(Call<Authorize> call, Throwable t) { 
       // something went completely south (like no internet connection) 
       Log.d(TAG, t.getMessage()); 
      } 
     }); 


     return null; 
    } 


} 

私はこのhereからの指示に従ってい は、ここに私のlogcatです。 私の改造バージョンは次のとおりです。

compile 'com.squareup.retrofit2:retrofit:2.0.2' 
compile 'com.squareup.retrofit2:converter-gson:2.0.2' 
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' 

最終ログ:お使いのベースURL得る可能性のある原因の

10-15 13:17:41.434 9968-9968 D/OkHttp: --> POST https://oauth.reddit.com/api/v1/me http/1.1 
10-15 13:17:41.434 9968-9968 D/OkHttp: Content-Length: 0 
10-15 13:17:41.434 9968-9968 D/OkHttp: Authorization: bearer tokenToken 
10-15 13:17:41.434 9968-9968 D/OkHttp: User-Agent: MyRedditClient/0.1 by myusername 
10-15 13:17:41.434 9968-9968 D/OkHttp: --> END POST (0-byte body) 
10-15 13:17:41.988 9968-9968 D/OkHttp: <-- 404 Not Found https://oauth.reddit.com/api/v1/me (553ms) 
10-15 13:17:41.988 9968-9968 D/OkHttp: Content-Type: application/json; charset=UTF-8 
10-15 13:17:41.988 9968-9968 D/OkHttp: x-frame-options: SAMEORIGIN 
10-15 13:17:41.988 9968-9968 D/OkHttp: x-content-type-options: nosniff 
10-15 13:17:41.988 9968-9968 D/OkHttp: x-xss-protection: 1; mode=block 
10-15 13:17:41.989 9968-9968 D/OkHttp: expires: -1 
10-15 13:17:41.989 9968-9968 D/OkHttp: cache-control: private, s-maxage=0, max-age=0, must-revalidate, max-age=0, must-revalidate 
10-15 13:17:41.990 9968-9968 D/OkHttp: x-ratelimit-remaining: 598.0 
10-15 13:17:41.990 9968-9968 D/OkHttp: x-ratelimit-used: 2 
10-15 13:17:41.990 9968-9968 D/OkHttp: x-ratelimit-reset: 136 
10-15 13:17:41.990 9968-9968 D/OkHttp: set-cookie: loid=Fsx2GnGYmufCQZ6cfT; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Mon, 15-Oct-2018 10:17:44 GMT; secure 
10-15 13:17:41.991 9968-9968 D/OkHttp: set-cookie: loidcreated=2016-10-15T10%3A17%3A44.173Z; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Mon, 15-Oct-2018 10:17:44 GMT; secure 
10-15 13:17:41.991 9968-9968 D/OkHttp: x-ua-compatible: IE=edge 
10-15 13:17:41.991 9968-9968 D/OkHttp: set-cookie: loid=Q52c9gouzuGGdg7UXW; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Mon, 15-Oct-2018 10:17:44 GMT; secure 
10-15 13:17:41.991 9968-9968 D/OkHttp: set-cookie: loidcreated=2016-10-15T10%3A17%3A44.189Z; Domain=reddit.com; Max-Age=63071999; Path=/; expires=Mon, 15-Oct-2018 10:17:44 GMT; secure 
10-15 13:17:41.991 9968-9968 D/OkHttp: X-Moose: majestic 
10-15 13:17:41.991 9968-9968 D/OkHttp: Content-Length: 38 
10-15 13:17:41.992 9968-9968 D/OkHttp: Accept-Ranges: bytes 
10-15 13:17:41.992 9968-9968 D/OkHttp: Date: Sat, 15 Oct 2016 10:17:44 GMT 
10-15 13:17:41.992 9968-9968 D/OkHttp: Via: 1.1 varnish 
10-15 13:17:41.992 9968-9968 D/OkHttp: Connection: keep-alive 
10-15 13:17:41.992 9968-9968 D/OkHttp: X-Served-By: cache-ams4426-AMS 
10-15 13:17:41.992 9968-9968 D/OkHttp: X-Cache: MISS 
10-15 13:17:41.992 9968-9968 D/OkHttp: X-Cache-Hits: 0 
10-15 13:17:41.992 9968-9968 D/OkHttp: X-Timer: S1476526664.126987,VS0,VE109 
10-15 13:17:41.993 9968-9968 D/OkHttp: Server: snooserv 
10-15 13:17:42.002 9968-9968 D/OkHttp: {"message": "Not Found", "error": 404} 
10-15 13:17:42.002 9968-9968 D/OkHttp: <-- END HTTP (38-byte body) 

答えて

0

私は最終的に私の解決策を見つける!私は間違ったgrant_typeで電話をしていました!私はそれを変更し、今それは働いている!

0

一つ。

Retrofit 2によれば、ベースURLは '/'で終わってはいけません。

ベースURLから「/」を削除して試してください。

Retrofit 1.9ではうまくいきました。

乾杯!

+0

「404 Not Found」エラーが取り除かれました。 – KostasC

+0

ライブラリ を使用してリクエストのログを共有してください。 'com.squareup.okhttp3:logging-interceptor:3.4.1' –

+0

これは、ヘッダー情報を含むリクエストと応答を提供します。このライブラリ呼び出しを使用するには:: HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); //目的のログレベルを設定します。 logging.setLevel(HttpLoggingInterceptor.Level.BODY); okHttpClientBuilder.interceptors()。add(logging); –

0

Retrofit 2.0がエンドポイントのURIスキームを解決するためにHttp Resolveを使用するため、このhttp://hello.comのようなベースルルを指定し、エンドポイントURLを/ world/fooと指定すると、破損します。

ベースURL http://hello.com/とエンドポイントURL world/fooを使用する必要があります。

/は違いになります。

もしあなたが私に知らせてください、または私はあなたに別の解決策を教えてくれるでしょう。 Link

そして、あなたがこの問題をチェックすることができます: あなたの問題は同じであるが、この問題のように私は思いますLink

+0

あなたの答え@ jamil-hasnine-tamimに感謝しますが、私はすでにこれを試しています! – KostasC

+0

うまくいかない? @KosrasC –

+0

いいえ、それはしませんでした。今、私は "エラー403、禁止されて"取得しています。 – KostasC

0

@POST("api/v1/me")

削除最初の文字のURLで後付け2.0 "で終わらなければなりませんBASEURLを必要とする「/」ために/ "あなたのコードで他の問題を見つけることができません。あなたは、エンドポイント/api/v1/meのためのあなたのAPI呼び出しを使用すると、GET要求を使用する必要がありenpoint /api/v1/meのための彼らのdocumentationによるとPOST方法

@POST("/api/v1/me") 
Call<Authorize> retrieveMyInfo(); 

ある

1

に任意のNULL値がある場合は、あなたのヘッダーをチェックしたり、APIのリンクを戻って確認する必要があります。

@GET("/api/v1/me") 
Call<Authorize> retrieveMyInfo(); 

それは(Python用)問題を解決し、私は、そのソリューションをテストしていないが、404の原因であると思われる、as in another post

関連する問題