400错误代码时使用twitter搜索API



我正在尝试在我的android应用程序上查询Twitter,并使用改装检索与关键字"AgilebizKE"相关的所有推文。我目前收到一个400错误代码。经过一些研究,我发现要么我的查询参数错误,要么我的请求没有得到"授权"。但是,我认为我的查询参数没有问题。主要活动相关代码:

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.twitter.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
tweetAPI tweetapi = retrofit.create(tweetAPI.class);
Call<List<tweet>> call = tweetapi.getTweets();
call.enqueue(new Callback<List<tweet>>() {
@Override
public void onResponse(Call<List<tweet>> call, Response<List<tweet>> response) {
if (!response.isSuccessful()) {
tweets_results.setText("code: " + response.code());
return;
}
List<tweet> tweets = response.body();
for (tweet tweet : tweets){
String content = "";
content+="Created at: "+tweet.getCreated_at()+"n";
content+="Text: "+tweet.getText()+"n";
content+="Retweets: "+tweet.getRetweet_count()+"n";
content+="Favs: "+tweet.getFavorite_count()+"nn";
tweets_results.append(content);
}
}
@Override
public void onFailure(Call<List<tweet>> call, Throwable t) {
tweets_results.setText(t.getMessage());
}
});

接口


public interface tweetAPI {
@GET("1.1/search/tweets.json?q=AgilebizKE")
Call<List<tweet>> getTweets();
}

推特pojo

ublic class tweet  {
private String created_at;
private String text;
private String retweet_count;
private String favorite_count;
public String getCreated_at() {
return created_at;
}
public String getText() {
return text;
}
public String getRetweet_count() {
return retweet_count;
}
public String getFavorite_count() {
return favorite_count;
}
}

好的,所以我决定改用twitter4j,而不是改造,因为它更容易、更快。有关详细信息,请访问此网站:http://twitter4j.org/

我现在将解释我是如何为我的用例实现twitter搜索功能的。

Android清单

添加这些权限

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />

build.gradle(模块:应用程序(

添加此

implementation files('libs/twitter4j-core-4.0.7.jar')

接下来,您必须创建一个JobIntentService,以便在主线程外运行twitter4j所需的网络功能。这是我用来更好地理解这个概念的视频:https://www.youtube.com/watch?v=B4gFbWnNpac&t=567s

TweetJobIntentService.java

在继续之前,请注册您的应用程序,并从twitter for devs门户网站获取其个人OAuth twitter凭据。在我在下面的代码示例中指出的地方填写这些凭据。

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.core.app.JobIntentService;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.ArrayList;
import java.util.List;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
public class TweetJobIntentService extends JobIntentService {
private static final String TAG = "TweetJobIntentService";
static void enqueueWork(Context context, Intent work) {
enqueueWork(context, TweetJobIntentService.class, 123, work);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
Log.d(TAG, "onHandleWork: ");
List tweets = new ArrayList();
Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer("Your_OAuthConsumerKey", "Your_AuthConsumerSecret");
AccessToken accessToken = new AccessToken("Your_OAuthAccessToken", "Your_OAuthAccessTokenSecret");
twitter.setOAuthAccessToken(accessToken);
Query query = new Query(Your_search_Keyword);
try {
QueryResult result = twitter.search(query);
for (Status status : result.getTweets()) {
Log.d(TAG, status.getText());
}
if (isStopped()) return;
} catch (TwitterException e) {
e.printStackTrace();
}

}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDeastroy");
}
@Override
public boolean onStopCurrentWork() {
Log.d(TAG, "onStopCurrentWork");
return super.onStopCurrentWork();
}
}

您检索到的推文应该打印在logcat中。

您的主要活动/片段

在这里,您将启动/调用JobIntentService。对我来说,我的服务是在onViewCreated方法中的一个片段中启动的。您可以通过点击按钮或任何您想要的方式启动。

Intent jobserviceIntent = new Intent(getActivity(), TweetJobIntentService.class);
TweetJobIntentService.enqueueWork(getActivity(), jobserviceIntent);

最新更新