2017-07-20 1 views
1

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?

+0

nous montrent votre code, en particulier celui qui utilise la modernisation – faruk

+0

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

+0

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

Répondre

2

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(); 
+0

Merci beaucoup.Woks bien :) –

1

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.