2016-01-31 29 views
5

Sto provando a impostare User-Agent con React Native su Android. Ho fatto qualche ricerca e sembra che dovrei usare uno Interceptor. Un esempio che ho trovato spiega come dovrebbe essere fatto (Link) ma poi non sono sicuro su come registrare l'Interceptor.React Native e okhttp su Android - Set User-Agent

Quindi, al fine di impostare la User-Agent sto usando questa classe:

public class CustomInterceptor implements Interceptor { 
    @Override public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request requestWithUserAgent = originalRequest.newBuilder() 
      .removeHeader("User-Agent") 
      .header("User-Agent", "Trevor") 
      .build(); 
     return chain.proceed(requestWithUserAgent); 
    } 
} 

Poi quello che è rimasto è quello di registrare l'intercettore sopra in modo in cui dovrebbe essere fatto? Forse nel MainActivity.java?

OkHttpClient okHttp = new OkHttpClient(); 
okHttp.interceptors().add(new CustomInterceptor()); 

io non sto ottenendo gli errori quando si costruisce l'applicazione quindi penso che il CustomInterceptor dovrebbe andare bene - solo bisogno di rendere l'applicazione usarlo.

UPDATE: Attualmente sto cercando di registrare l'intercettore in MainActivity ma non raccoglierla:

public class MainActivity extends ReactActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    OkHttpClient client = new OkHttpClient(); 
    client.networkInterceptors().add(new CustomInterceptor()); 

    }; 

}; 
+0

Ciao @ekonstantinidis, provo a usare 'okhttp' anche con' react-native'.Tuttavia ottengo un errore quando eseguo il comando di 'react-native run-android'. Come sei riuscito a superarlo? – efkan

+0

Immagino che per causa dell'uso di 'okhttp' lib non si sia verificato un errore. 'react-native' usa' okhttp3' lib e provo a usare la stessa lib sfortunatamente. – efkan

risposta

3

Quindi ho finalmente capito. Ecco la soluzione per ignorare l'User-Agent di okhttp con React Native.

Creare un file chiamato CustomInterceptor.java:

package com.trevor; 

import com.squareup.okhttp.Interceptor; 
import com.squareup.okhttp.Request; 
import com.squareup.okhttp.Response; 

import java.io.IOException; 

public class CustomInterceptor implements Interceptor { 

    public CustomInterceptor() {} 

    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request requestWithUserAgent = originalRequest.newBuilder() 
      .removeHeader("User-Agent") 
      .addHeader("User-Agent", "Trevor") 
      .build(); 

     return chain.proceed(requestWithUserAgent); 
    } 

} 

Poi nel MainActivity.javaesclusione il metodo onCreate:

... 
import com.facebook.react.modules.network.OkHttpClientProvider; 
... 

public class MainActivity extends ReactActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     attachInterceptor(); 
    } 

    private void attachInterceptor() { 
     OkHttpClient client = OkHttpClientProvider.getOkHttpClient(); 
     client.networkInterceptors().add(new CustomInterceptor()); 
    } 
} 

Nota che sto importando com.facebook.react.modules.network.OkHttpClientProvider; e ignorando che il cliente invece di creare una vaniglia OkHttpClient poiché questo è quello che verrà utilizzato da React Native.

0

Ho implementato questa funzionalità utilizzando OkHttp e il mio codice è piuttosto la come il tuo - e tutto funziona bene.

Considerare l'utilizzo di addHeader("User-Agent", "Trevor") anziché header("User-Agent", "Trevor"), poiché quest'ultimo sostituirà tutte le intestazioni già impostate.

Sto usando okHttp.networkInterceptors().add(new CustomInterceptor()); anziché okHttp.interceptors().add(new CustomInterceptor());, ma non penso che sia un problema qui.

Aggiornamento Lo faccio anche nel metodo onCreate(). Tutto funziona come dovrebbe

+0

Sembra giusto! Quello che sto cercando è un modo per registrare quell'intercettore. Dovrei farlo in 'MainActivity' sostituendo' onCreate' e come? Ho aggiunto un esempio alla domanda. – manosim

+0

@iamemmanouil ha aggiornato la mia risposta –

5

React Native sta iterando così rapidamente che la risposta accettata non ha funzionato per me.

Per RN 0.27.2 ho dovuto importare okhttp3.OkHttpClient nel mio CustomInterceptor e modificare il metodo attachInterceptor() in MainActivity per sostituire il client.

private void attachInterceptor() { 
    OkHttpClient currentClient = OkHttpClientProvider.getOkHttpClient(); 
    OkHttpClient replacementClient = currentClient.newBuilder().addNetworkInterceptor(new CustomInterceptor()).build(); 
    OkHttpClientProvider.replaceOkHttpClient(replacementClient); 
} 

Tutto il resto dalla risposta di ekonstantinidis funziona per me.

+0

non funziona per me con RN 0.51.0, il NativeModule ne crea uno nuovo – hoot