我正在尝试使用retrofit 2.0和OkHTTP库构建一个应用程序。现在的问题是,当我从移动浏览器点击服务器时,它会检测到我的Android版手机。但是当我通过我的应用程序点击服务器时,服务器会将其检测为机器人。所以我的应用程序如何检测我的手机,因为将来服务器将限制机器人类型访问。
答案 0 :(得分:3)
可以使用user-agent
标题
通过在改造对象中插入自定义OkHttpClient
,您可以将自定义标头注入所有http请求的默认标头。
例如,您要添加的自定义标题是:
'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
然后你的改装代码应该是这样的:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"); // <-- this is the important line
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
OkHttpClient mClient = httpClient.build();
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(YOUR_BASE_URL)
.client(mClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
答案 1 :(得分:1)
这很可能是由User-Agent标头或一些额外标头的混合引起的。更复杂的情况可能是服务器检查客户端是否运行javascript这可能更复杂。尝试记录您要发送的标题。
Logger log = LoggerFactory.getLogger(HttpClient.class);
HttpLoggingInterceptor loggingInterceptor =
new HttpLoggingInterceptor((msg) -> {
log.debug(msg);
});
loggingInterceptor.setLevel(Level.BODY);
// pass this client into Retrofit
OkHttpClient networkInterceptorClient = new OkHttpClient.Builder()
.addNetworkInterceptor(HttpClient.getLoggingInterceptor())
.build();
这应该给你非常detailed OkHttp logging包括发送的所有标题。然后,您可以添加拦截器以覆盖每个HTTP请求上的用户代理,并选择基于浏览器的拦截器,以使服务器认为您使用的是Web浏览器。
如果这不起作用,请继续比较不同的标头,看看是否可以创建cURL
未被检测为机器人的请求。