2017-02-12 4 views
0

Neu zum Nachrüsten und versuchen, Instagram-API mit Retrofit zu verbrauchen. Unten ist das Setup. Zuerst habe ich die Schnittstelle zu definieren, um mit dem Instagram-API zu kommunizierenRetrofit + Instagram-API gibt Fehler 400 zurück, wenn Sie Zugriffstoken anfordern

public interface API { 
    @POST("oauth/access_token") 
    Call<AccessToken> getAccessToken(@Body TokenRequest tokenRequest); 
} 

Unten ist mein Implementierung

public class APIPresenter implements Callback<List<APIResponse>> { 

static final String BASE_URL = "https://api.instagram.com/"; 

public void startI(String code){ 
    Gson gson = new GsonBuilder() 
      .setLenient() 
      .create(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

    API r = retrofit.create(API.class); 

    Call<AccessToken> call = r.getAccessToken(new TokenRequest("CLIENT_ID", "CLIENT_SECRET", "authorization_code", "redirecturi", code)); 
    call.enqueue(new Callback<AccessToken>() { 
     @Override 
     public void onResponse(Call<AccessToken> call, Response<AccessToken> response) { 
      // Log.i("WORKING", response.body().access_token + " " + response.body().user.getUsername()); 
      Log.i("WORKING", String.valueOf(response.code())); 
     } 

     @Override 
     public void onFailure(Call<AccessToken> call, Throwable t) { 
      t.printStackTrace(); 
     } 
    }); 
} 

TokenRequest

public class TokenRequest { 
    private String client_id; 
    private String client_secret; 
    private String grant_type; 
    private String redirect_uri; 
    private String code; 

    public TokenRequest(String client_id, String client_secret, String grant_type, String redirect_uri, String code) { 
     this.client_id = client_id; 
     this.client_secret = client_secret; 
     this.grant_type = grant_type; 
     this.redirect_uri = redirect_uri; 
     this.code = code; 
    } 
} 

AccessToken Modell

public class AccessToken { 

    @SerializedName("access_token") 
    @Expose 
    public String access_token; 
    @SerializedName("user") 
    @Expose 
    public User user; 

} 

Problem ist, dass, wenn ich versuche, den Inhalt der Antwort in der onResponse-Methode auszugeben, bekomme ich eine Null. Ich bin mir nicht sicher, was ich falsch mache

aktualisieren Ich erhalte die folgende Fehlermeldung

{ "Code": 400, "error_type": "OAuthException", „error_message ":" Sie müssen eine client_id angeben "}

Antwort

0

ich es geschafft, dieses Problem zu lösen, Problem war Instagram nicht unterstützt die Parameter als URL-Parameter zu senden, müssen sie gesendet werden im Körper Inhalt des POST. Der Inhaltstyp sollte auf "application/x-www-form-urlencoded" eingestellt sein.

Dies ist, wie Sie Sie es mit dem Code oben

Sie erreichen haben @FormURLEncoded Anmerkung vor der POST-Methode hinzufügen, wird dies nur @Field Annotation arbeiten, daher der @Body Inhalt erhält folgende Fassung @Field-Annotation.

public interface API { 
@FormURLEncoded 
@POST("oauth/access_token") 
Call<AccessToken> getAccessToken(
     @Field("client_id") String client_id, 
     @Field("client_secret") String client_secret, 
     @Field("grant_type") String grant_type, 
     @Field("redirect_uri") String redirect_uri, 
     @Field("code") String code); 
} 

Dies ist, wie Sie die Details zu Ihrem getAccessToken Methode auf der Schnittstelle

Call<AccessToken> call = r.getAccessToken("CLIENT_ID", "CLIENT_SECRET", "authorization_code", "redirecturi", code); 

senden Diese perfekt funktionieren sollte!

0

Sie geben client_id und andere Felder falsch ein. Schauen Sie, wie es in ähnlichen Projekt umgesetzt wird:

public static String requestOAuthUrl(final String clientId, final String redirectUri, final Scope... scopes) throws URISyntaxException { 
     final StringBuilder urlBuilder = new StringBuilder(); 
     urlBuilder.append("response_type=").append("token"); 
     urlBuilder.append("&client_id=").append(clientId); 
     urlBuilder.append("&redirect_uri=").append(redirectUri); 
     if (scopes != null) { 
      final StringBuilder scopeBuilder = new StringBuilder(); 
      for (int i = 0; i < scopes.length; i++) { 
       scopeBuilder.append(scopes[i]); 
       if (i < scopes.length - 1) { 
        scopeBuilder.append(' '); 
       } 
      } 
      urlBuilder.append("&scope=").append(scopeBuilder.toString()); 
     } 
     return new URI("https", "instagram.com", "/oauth/authorize", urlBuilder.toString(), null).toString(); 
    } 

Aus genommen wird https://github.com/wearemakery/retrogram

+0

Danke, aber diese Lösung wird nicht mit meinem Projekt arbeiten, da es auf Retrofit 1.6.1 gebaut wurde. Ich habe das Problem jedoch behoben, Sie können meine Antwort überprüfen. –

Verwandte Themen