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

Java 400使用twitter搜索API时的错误代码,java,android,rest,twitter,retrofit,Java,Android,Rest,Twitter,Retrofit,我试图在我的android应用程序上查询Twitter,并使用改型检索与关键字“AgilebizKE”相关的所有推文。 我目前得到一个400错误代码。在做了一些研究之后,我发现要么是我的查询参数错误,要么是我的请求没有“授权”。但是,我发现我的查询参数没有问题。 主要活动相关代码: Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.twitter.com/")

我试图在我的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()+"\n\n";
                    tweets_results.append(content);
                }
            }

            @Override
            public void onFailure(Call<List<tweet>> call, Throwable t) {
                tweets_results.setText(t.getMessage());
            }
        });

好的,所以我决定改用twitter4j而不是改型,因为它更简单、更快。有关此网站的更多详细信息,请访问此网站:

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

Android清单

添加这些权限

 <uses-permission android:name="android.permission.WAKE_LOCK" />
 <uses-permission android:name="android.permission.INTERNET" />
接下来,您必须创建一个JobIntentService,以便在主线程之外运行twitter4j所需的网络功能。这是我用来更好地理解这个概念的视频:

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

你能发布你的日志吗?你是如何生成oAuth头的?您能够访问任何其他Twitter API吗?从本文档[。此API需要身份验证。@HelloWorld在文档中似乎建议只有premium和enterprise search需要身份验证。转到developer.Twitter.com并生成使用者密钥。然后查看java中生成oAuth头的答案或使用库。
 implementation files('libs/twitter4j-core-4.0.7.jar')
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();
    }
}

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