2017-02-12 279 views
0

新改造,並試圖通過改進來使用Instagram API。以下是設置。 首先我定義的接口與Instagram的APIRetrofit + Instagram API在請求訪問令牌時返回錯誤400

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

下面的交流是我實現

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模型

public class AccessToken { 

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

} 

問題是當我嘗試在onResponse方法中輸出響應的內容時,我得到一個空值。我不知道我在做什麼錯

更新 我收到以下錯誤消息

{ 「代碼」:400, 「ERROR_TYPE」: 「OAuthException」,「ERROR_MESSAGE 「:」您必須提供一個client_id「}

回答

0

我設法解決這個問題所採取的,問題是Instagram的不支持發送參數URL參數,它們必須被送到在POST的正文內容中。 內容類型應設置爲「application/x-www-form-urlencoded」。

你這是怎麼你上面

你有POST方法之前添加註釋@FormURLEncoded代碼完成它,這隻會工作@Field註釋,因此@Body內容應以下述代替@Field註解。

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

這是您將如何詳細信息發送到您的getAccessToken方法在接口上

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

這應該很好地工作!

0

您正在以錯誤的方式發佈client_id和其他字段。看看它是如何在類似的項目實施:

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

它是由https://github.com/wearemakery/retrogram

+0

謝謝,但這種解決方案不會與我的項目一起工作,因爲它是在改進版1.6.1上構建的。然而,我已經解決了這個問題,你可以查看我的答案。 –

相關問題