2015-05-04 4 views
1

Я пытаюсь получить список пользовательских твитов, и я столкнулся с некоторыми проблемами при попытке аутентификации моего вызова API. В настоящее время я получаю 401 при выполнении кода ниже:Извлечь список твитов данного пользователя, используя Twitter API 1.1 и Retrofit

public interface TwitterApi { 

    String API_URL = "https://api.twitter.com/1.1"; 

    String CONSUMER_KEY = "<CONSUMER KEY GOES HERE>"; 
    String CONSUMER_SECRET = "<CONSUMER SECRET GOES HERE>"; 
    String ACCESS_TOKEN = "<ACCESS TOKEN GOES HERE>"; 
    String ACCESS_TOKEN_SECRET = "<ACCESS TOKEN SECRET GOES HERE>"; 

     @GET("/statuses/user_timeline.json") 
     List<Tweet> fetchUserTimeline(
      @Query("count") final int count, 
      @Query("screen_name") final String screenName); 
     } 

Следующая кидает ошибку 401 авторизации при вызове fetchUserTimeline()

RetrofitHttpOAuthConsumer consumer = new RetrofitHttpOAuthConsumer(TwitterApi.CONSUMER_KEY, TwitterApi.CONSUMER_SECRET); 
     consumer.setTokenWithSecret(TwitterApi.ACCESS_TOKEN, TwitterApi.ACCESS_TOKEN_SECRET); 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(TwitterApi.API_URL) 
       .setClient(new SigningOkClient(consumer)) 
       .build(); 


     TwitterApi twitterApi = restAdapter.create(TwitterApi.class) 

     tweets = twitterApi.fetchUserTimeline(2, screenName); 

Я также включил соответствующий код из указателю-дооснащения плагин:

public class SigningOkClient extends OkClient { 

    private final RetrofitHttpOAuthConsumer mOAuthConsumer; 

    public SigningOkClient(RetrofitHttpOAuthConsumer consumer) { 
     mOAuthConsumer = consumer; 
    } 

    public SigningOkClient(OkHttpClient client, RetrofitHttpOAuthConsumer consumer) { 
     super(client); 
     mOAuthConsumer = consumer; 
    } 

    @Override 
    public Response execute(Request request) throws IOException { 
     Request requestToSend = request; 
     try { 
      HttpRequestAdapter signedAdapter = (HttpRequestAdapter) mOAuthConsumer.sign(request); 
      requestToSend = (Request) signedAdapter.unwrap(); 
     } catch (OAuthMessageSignerException | OAuthExpectationFailedException | OAuthCommunicationException e) { 
      // Fail to sign, ignore 
      e.printStackTrace(); 
     } 
     return super.execute(requestToSend); 
    } 

} 

указателю-модифицированная плагин можно найти здесь: https://github.com/pakerfeldt/signpost-retrofit

public class RetrofitHttpOAuthConsumer extends AbstractOAuthConsumer { 

    private static final long serialVersionUID = 1L; 

    public RetrofitHttpOAuthConsumer(String consumerKey, String consumerSecret) { 
    super(consumerKey, consumerSecret); 
    } 

    @Override 
    protected HttpRequest wrap(Object request) { 
     if (!(request instanceof retrofit.client.Request)) { 
     throw new IllegalArgumentException("This consumer expects requests of type " + retrofit.client.Request.class.getCanonicalName()); 
     } 
     return new HttpRequestAdapter((Request) request); 
    } 
} 

Любая помощь здесь будет замечательной. В решении нет есть, чтобы включить использование указателя, но я хочу использовать Retrofit. Я также не хочу показать пользователю экран «Authenticate with Twitter» в WebView - я просто хочу отобразить несколько важных твитов как часть подробного представления.

+0

Где вы получаете токен аутентификации? –

ответ

0

Вы уверены, что проект, основанный на указателе, работает для twitter oauth? Я использовал twitter4j успешно в прошлом - и если вам не нужна полная библиотека, вы можете использовать их код для справки. twitter4j

+0

В соответствии с этим Gist он работает: https://gist.github.com/billynyh/9e96d228b0e64c7c3251 – HBG