Je suis en train de construire une application en utilisant retrofit 2.0 et la bibliothèque OkHTTP.Maintenant, le problème est lorsque je frappe le serveur à partir du navigateur mobile, il détecte mon téléphone avec la version Android. Mais quand je frappe le serveur via mon application, le serveur le détecte comme un robot. Alors, que faire dans mon application pour détecter mon téléphone, car dans le futur serveur limitera l'accès de type robot.Pourquoi serveur détecter l'application en tant que robot, Au lieu de la version Android?
Répondre
Peut être que vous pouvez utiliser user-agent
tête
Vous pouvez injecter en-tête personnalisé en-tête par défaut pour toute demande http, en insérant la coutume OkHttpClient
dans l'objet de rénovation.
Par exemple, l'en-tête personnalisé que vous souhaitez ajouter est:
'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'
Ensuite, votre code de mise à niveau devrait ressembler à ceci:
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();
Merci beaucoup.Woks bien :) –
Cela est probablement dû à l'en-tête User-Agent ou à un mélange d'en-têtes supplémentaires. Un cas plus complexe pourrait être si le serveur vérifie si le client exécute javascript cela pourrait être plus complexe. Essayez de consigner les en-têtes que vous envoyez.
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();
Cela devrait vous donner très detailed OkHttp logging y compris tous les en-têtes envoyés. Vous pouvez ensuite ajouter un intercepteur pour remplacer l'agent utilisateur à chaque requête HTTP et sélectionner un intercepteur pour que le serveur pense que vous utilisez un navigateur Web.
Si cela ne fonctionne pas, continuez à comparer les différents en-têtes et voyez si vous pouvez créer une requête avec cURL
qui n'est pas détectée comme un robot.
nous montrent votre code, en particulier celui qui utilise la modernisation – faruk
Je fais- 'OkHttpClient.Builder httpClient = nouveau OkHttpClient.Builder(); httpClient.addInterceptor (nouvelle Interceptor() { @Override interception okhttp3.Response publique (chaîne de la chaîne) throws IOException { Demande initiale = chain.request(); Request.Builder requestBuilder = original.newBuilder() .header ("user-Agent", "agent utilisateur"); demande = demande requestBuilder.build(); chain.proceed de retour (demande);} }); ' –
Et then- ' Retrofit.Builder builder = new Retrofit.Builder() .baseUrl (API_BASE_URL) .addConverterFactory ( GsonConverterFactory.create()); Retrofit retrofit = builder.client (httpClient.build()) .build(); loginAPI = retrofit.create (LoginAPI.class); ' –