11

User-AgentAndroidでReact Nativeを設定しようとしています。いくつかの調査を行ったところ、okhttp Interceptorを使用する必要があるようです。私が見つけた例では、これを行う方法を説明しています(リンク)が、インターセプターを登録する方法がわかりません。

したがって、を設定するために、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アプリをビルドするときにエラーが発生しないので、アプリで使用するだけで問題ないと思います。

更新:現在、インターセプターを登録しようとしてMainActivityいますが、それを取得しません:

public class MainActivity extends ReactActivity {

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

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

  };

};
4

5 に答える 5

7

というわけで、やっと思いつきました。okhttp3これは、 React Nativeで User-Agent をオーバーライドするためのソリューションです。

というファイルを作成しますCustomInterceptor.java

package com.trevor;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.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);
    }

}

次に、メソッドをMainActivity.java オーバーライドします。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());
    }
}

これは React Native が使用するものであるためcom.facebook.react.modules.network.OkHttpClientProvider; 、バニラを作成する代わりに、そのクライアントをインポートしてオーバーライドしていることに注意してください。OkHttpClient

于 2016-02-03T22:55:18.007 に答える
5

React Native のイテレーションが非常に速いため、受け入れられた回答がうまくいきませんでした。

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

ekonstantinidis の答えの他のすべては私にとってはうまくいきます。

于 2016-06-26T21:57:39.960 に答える
0

私は OkHttp を使用してこの機能を実装しましたが、私のコードはあなたのコードとほとんど同じで、すべて正常に動作します。

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

okHttp.networkInterceptors().add(new CustomInterceptor());の代わりに使っokHttp.interceptors().add(new CustomInterceptor());ていますが、ここでは気にならない程度だと思います。

更新方法でも行いonCreate()ます。すべてが正常に機能します。

于 2016-02-01T08:28:48.310 に答える