2016-10-15 7 views
6

ich Retrofit bin mit einem Android-Client für den Reddit zu erstellen. Bei logcat, um die Toke zu bekommen ist gut, aber wenn ich versuche, die Informationen des Login-Benutzers zu bekommen, bekomme ich "404 Not Found". Hier ist meine logcat:Android Retrofit2 reddit 404 Not Found

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) 

Hier ist mein Code:

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; 
    } 


} 

Ich folge den Anweisungen von diesem here. Meine Retrofit-Version ist:

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' 

Last log:

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) 

Antwort

0

Ich finde endlich meine Lösung! Ich habe mit falschem grant_type telefoniert! Ich ändere es und jetzt funktioniert es!

0

Eine mögliche Ursache kann Ihr BASE URL sein.

Nach Retrofit 2, URL Basis darf nicht mit '/' enden.

Bitte entfernen Sie ‚/‘ von Basis-URL und eine versuchen.

In Retrofit 1,9, arbeitet es in Ordnung.

Prost !!!

+0

Ich entfernte und immer noch "404 Not Found" -Fehler. – KostasC

+0

Bitte teilen Sie Protokolle Ihrer Anfrage mit Hilfe der Bibliothek kompilieren 'com.squareup.okhttp3: logging-interceptor: 3.4.1' –

+0

Es wird die Anfrage und Antwort mit Header-Informationen geben. Um diese Bibliothek zu verwenden, rufen Sie :: HttpLoggingInterceptor auf logging = new HttpLoggingInterceptor(); // Legen Sie Ihre gewünschte Protokollstufe fest logging.setLevel (HttpLoggingInterceptor.Level.BODY); okHttpClientBuilder.interceptors(). Add (logging); –

0

Aufgrund der Verwendung von Http Resolve für die Auflösung des URI-Schemas Ihrer Endpunkte durch Retrofit 2.0 wird die baseurl wie diese http://hello.com und die Endpunkt-URL als/world/foo angegeben.

Sie benötigen Basis-URL http://hello.com/ und Endpunkt-URL Welt/foo zu verwenden.

Der/macht den Unterschied.

Wenn es Ihnen hilft, bitte informieren Sie mich, oder ich gebe Ihnen eine andere Lösung. Ihr Problem ist das gleiche wie dieses Problem, das ich denke: Link

und Sie können diese Fragen prüfen: Link

+0

Danke für deine Antwort @ jamil-hasnine-tamim, aber ich habe es bereits versucht! – KostasC

+0

Hat nicht funktioniert? @KosrasC –

+0

Nein, hat es nicht. Jetzt bekomme ich "Error 403, Forbidden". – KostasC

0

@POST("api/v1/me")

entfernen "/" auf den ersten Zeichen url weil Nachrüstung 2.0 müssen baseURL muss mit "beenden/".. Ich kann kein anderes Problem in Ihrem Code finden. Sie sollten Ihren Kopf überprüfen, ob es einen Nullwert oder die API-Link

Anruf
1

Ihre API prüfen für Endpunkt /api/v1/mePOST Methode ist

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

Nach ihrer documentation für enpoint /api/v1/me Sie GET Anfragen verwendet werden soll.

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

Ich habe nicht diese Lösung testen, aber es scheint die Ursache zu sein für 404, as in another post es das Problem gelöst (für Python).

Verwandte Themen