2017-02-12 2 views
0

Новое для модернизации и попытки использовать API Instagram с использованием модификации. Ниже приведена настройка. Сначала я определить интерфейс для связи с 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; 
    } 
} 

модель

маркер доступа
public class AccessToken { 

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

} 

Проблема в том, что когда я пытаюсь вывести содержимое ответа в методе onResponse, я получаю нуль. Я не уверен, что я делаю неправильно

Update Я получаю следующее сообщение об ошибке

{ "код": 400, "ERROR_TYPE": "OAuthException", «error_message ":" Вы должны предоставить client_id "}

ответ

0

мне удалось решить эту проблему, вопрос был Instagram не поддерживает отправку параметров в качестве параметров URL, они должны быть отправлены в содержании тела POST. Тип контента должен быть установлен в «application/x-www-form-urlencoded».

Это, как вы вы выполняете его с выше

Вы должны добавить @FormURLEncoded аннотацию перед методом POST кода, это будет работать только @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. Однако я исправил проблему, вы можете проверить мой ответ. –