1

我正在尝试获取用户的推文列表,但在尝试验证对 API 的调用时遇到了一些麻烦。我目前在执行以下代码时得到 401:

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

以下调用 fetchUserTimeline() 时抛出 401 Authorization 错误

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

我还包含了来自 signpost-retrofit 插件的相关代码:

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。我也不想在 WebView 中向用户显示“使用 Twitter 进行身份验证”屏幕 - 我只想显示一些相关的推文作为详细视图的一部分。

4

1 回答 1

0

你确定路标改造项目适用于 twitter oauth 吗?我过去曾成功使用过 twitter4j - 如果您不想要完整的库,您可以使用他们的代码作为参考。 推特4j

于 2015-05-04T23:29:56.507 回答