2016-01-31 30 views
5

User-AgentをAndroidでリアクションネイティブに設定しようとしています。いくつかの研究をしましたが、私はokhttpインターセプタを使用する必要があります。私が見つけた例では、これをどのように行うべきかが説明されていますが(Link)、インターセプタを登録する方法はわかりません。Androidでネイティブ&okhttpに反応する - ユーザーエージェントを設定する

のでUser-Agentを設定するために、私はこのクラスを使用しています:

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

次に何残っていることは、それが行われる必要がありますどこので、上記のインターセプタを登録するのですか?多分MainActivity.javaにありますか?

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

アプリを構築するとき、私はので、私はCustomInterceptorは問題ないはずだと思うすべてのエラーを取得していないです - ちょうどアプリはそれを使うようにする必要があります。

UPDATE: 私は現在MainActivityにインターセプタを登録しようとしているが、それはそれを拾うません。

public class MainActivity extends ReactActivity { 

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

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

    }; 

}; 
+0

こんにちは@ekonstantinidis、私は 'react-native'でも' okhttp'を使ってみます。しかし、私は 'react-native run-android'コマンドを実行するとエラーになります。あなたはそれを克服するためにどのように成功しましたか? – efkan

+0

あなたが 'okhttp'libを使うと、あなたはエラーに遭遇しなかったと思います。 'react-native'は' okhttp3'libを使い、残念なことに同じlibを使います。 – efkan

答えて

3

だから私はついにそれを理解しました。ここでは、okhttpのUser-AgentをReact Nativeで上書きするソリューションがあります。私はcom.facebook.react.modules.network.OkHttpClientProvider; をインポートし、そのクライアントを上書きする代わりにバニラを作成してい

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

注:MainActivity.javaオーバーライドonCreate方法で次に

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

} 

CustomInterceptor.javaというファイルを作成します。これはReact Nativeが使用するものなので、OkHttpClientです。

0

を私はOkHttpを使用してこの機能を実装しましたし、私のコードはかなりありますあなたのものと同じです。

header("User-Agent", "Trevor")の代わりにaddHeader("User-Agent", "Trevor")を使用することをお勧めします。これは、すでに設定されているすべてのヘッダーを置き換えるためです。

私はokHttp.interceptors().add(new CustomInterceptor());の代わりにokHttp.networkInterceptors().add(new CustomInterceptor());を使用していますが、ここでは問題ではないと思います。

更新onCreate()でもそれを行います。すべてが必要なように機能します。

+0

そうだね!私が探しているのは、そのインターセプタを登録する方法です。 'onCreate'をオーバーライドする' MainActivity'でそれを行うべきでしょうか?私はその質問の例を追加しました。 – manosim

+0

@iamemmanouil更新私の答え –

5

リアクションネイティブはとても速く反復されているため、受け入れられた回答は私にとってはうまくいきませんでした。

RN 0.27.2では、CustomInterceptorでokhttp3.OkHttpClientをインポートし、MainActivityのattachInterceptor()メソッドを変更してクライアントを置き換えなければなりませんでした。

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

エコンタンティニディスの回答は他にもあります。

+0

は、私のためにはRN 0.51.0で動作しない、NativeModuleは新しいものを作成する – hoot

関連する問題