Android上的React Native&okhttp - 设置用户代理

man*_*sim 8 java android okhttp react-native okhttp3

我正在尝试User-Agent在Android上设置React Native.做了一些研究,看起来我应该使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么剩下的就是注册上面的拦截器,以便它应该在哪里完成?也许在MainActivity.java

OkHttpClient okHttp = new OkHttpClient();
okHttp.interceptors().add(new CustomInterceptor());
Run Code Online (Sandbox Code Playgroud)

构建应用程序时我没有遇到任何错误,所以我认为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());

  };

};
Run Code Online (Sandbox Code Playgroud)

har*_*aac 8

对于 RN 0.63.2,这里的所有答案都不适合我。我能够让它工作,并且在我的研究中能够找到支持此功能的(尽管非常稀缺)文档。

我能找到的唯一文档是这个 PR,其中有人添加了对此功能的支持(并破坏了当前接受的答案)。当我尝试添加 PR 中记录的拦截器时,我得到了一个相关的异常CookieJar,我能够在这个(未解决的)问题中找到解决方案。

域名注册地址:

在与您MainApplication调用的文件夹相同的文件夹中添加一个 Java 类UserAgentInterceptor.java并将其放入其中:

package YOUR.PACKAGE.NAME; // <-- REPLACE ME

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class UserAgentInterceptor implements Interceptor {

  public UserAgentInterceptor() {}

  @Override
  public Response intercept(Interceptor.Chain chain) throws IOException {
    Request originalRequest = chain.request();
    Request requestWithUserAgent = originalRequest.newBuilder()
      .removeHeader("User-Agent")
      .addHeader("User-Agent", "YOUR USER AGENT") // <-- REPLACE ME
      .build();

    return chain.proceed(requestWithUserAgent);
  }

}
Run Code Online (Sandbox Code Playgroud)

然后在同一个文件夹中创建另一个 Java 类UserAgentClientFactory.java并将其放入其中:

package YOUR.PACKAGE.NAME; // <-- REPLACE ME

import com.facebook.react.modules.network.OkHttpClientFactory;
import com.facebook.react.modules.network.ReactCookieJarContainer;

import okhttp3.OkHttpClient;

public class UserAgentClientFactory implements OkHttpClientFactory {
  public OkHttpClient createNewNetworkModuleClient() {
    return new OkHttpClient.Builder()
      .cookieJar(new ReactCookieJarContainer())
      .addInterceptor(new UserAgentInterceptor())
      .build();
  }
}

Run Code Online (Sandbox Code Playgroud)

然后在您的MainApplication onCreate方法中像这样注册工厂:

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

@Override
public void onCreate() {
  super.onCreate();

  OkHttpClientProvider.setOkHttpClientFactory(new UserAgentClientFactory());

  // Your other code stuffs

}
Run Code Online (Sandbox Code Playgroud)

就是这样!


Ste*_*ven 6

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);
}
Run Code Online (Sandbox Code Playgroud)

来自ekonstantinidis的其他所有答案都适合我.


man*_*sim 5

所以我终于想通了。这是okhttp使用React Native 覆盖User-Agent的解决方案。

创建一个名为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);
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,在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());
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在导入com.facebook.react.modules.network.OkHttpClientProvider; 和覆盖该客户端,而不是创建一个香草,OkHttpClient因为这是React Native将使用的那个。