2016-01-31 13 views
5

Ich versuche, die User-Agent mit React Native auf Android zu setzen. Habe etwas geforscht und es sieht so aus als würde ich einen okhttpInterceptor verwenden. Ein Beispiel, das ich gefunden habe, erklärt, wie das gemacht werden sollte (Link), aber ich bin mir nicht sicher, wie ich den Interceptor registrieren soll.Native & okhttp auf Android reagieren - Set User-Agent

So um die User-Agent einzustellen ich diese Klasse bin mit:

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

Was dann übrig bleibt, ist die oben Interceptor zu registrieren, so, wo es getan werden sollte? Vielleicht in MainActivity.java?

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

ich keine Fehler bekommen, wenn Aufbau der App, also denke ich, dass die CustomInterceptor sollte in Ordnung sein - müssen nur die App sie verwenden machen.

UPDATE: Ich versuche derzeit die Abfangjäger in MainActivity zu registrieren, aber es wird nicht abholen:

public class MainActivity extends ReactActivity { 

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

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

    }; 

}; 
+0

Hallo @ekonstantinidis, ich versuche auch 'okhttp' mit' reactive-native' zu ​​verwenden.Allerdings bekomme ich einen Fehler, wenn ich den Befehl 'reactive-native run-android' ausführe. Wie ist es dir gelungen, das zu überwinden? – efkan

+0

Ich denke, wegen der Verwendung von 'okhttp' lib gab es keinen Fehler. 'reactive-native' benutzt' okhttp3' lib und ich versuche leider die selbe lib zu verwenden. – efkan

Antwort

3

Also ich habe es endlich herausgefunden. Hier ist die Lösung zum Überschreiben des User-Agent von okhttp mit React Native.

Erstellen Sie eine Datei namens 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); 
    } 

} 

Dann in MainActivity.javaÜberschreibung die onCreate Methode:

... 
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()); 
    } 
} 

Bitte beachte, dass ich com.facebook.react.modules.network.OkHttpClientProvider; bin Import und überschreiben, dass Client stattdessen eine Vanille schaffen OkHttpClient da dies das ist, das React Native verwenden wird.

0

ich diese Funktionalität implementiert haben mit OkHttp und mein Code ist ziemlich die wie bei dir - und alles funktioniert gut.

Verwenden Sie addHeader("User-Agent", "Trevor") anstelle von header("User-Agent", "Trevor"), da letztere alle bereits gesetzten Header ersetzen wird.

Ich benutze okHttp.networkInterceptors().add(new CustomInterceptor()); anstelle von okHttp.interceptors().add(new CustomInterceptor());, aber ich denke nicht, dass es hier ein Problem ist.

Update Ich mache es in onCreate() Methode auch. Alles funktioniert wie es soll.

+0

Das klingt richtig! Ich suche nach einer Möglichkeit, diesen Interceptor zu registrieren. Sollte ich das in der 'MainActivity' machen, die' onCreate' überschreibt und wie? Ich habe ein Beispiel zu der Frage hinzugefügt. – manosim

+0

@iamemmanouil aktualisiert meine Antwort –

5

React Native iteriert so schnell, dass die akzeptierte Antwort für mich nicht funktioniert hat.

Für RN 0.27.2 musste ich okhttp3.OkHttpClient in meinem CustomInterceptor importieren und die Methode attachInterceptor() in MainActivity ändern, um den Client zu ersetzen.

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

Alles andere von constantinidis Antwort funktioniert für mich.

+0

nicht für mich mit RN 0.51.0, das NativeModule erstellen ein neues – hoot