当前位置: 首页 > 面试题库 >

在Android上反应Native&okhttp-设置用户代理

夹谷和裕
2023-03-14
问题内容

我正在尝试User-Agent在Android上使用React Native 设置。做过一些研究,看来我应该使用okhttp 拦截器
。我找到了一个示例,说明了如何完成此操作(Link),但是随后我不确定如何注册拦截器。

所以为了设置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());

  };

};

问题答案:

所以我终于想通了。这是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);
    }

}

然后,在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());
    }
}

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



 类似资料:
  • 我的应用程序在Lolipop设备上运行得很好,但在Kit Kat版本上甚至无法打开。它告诉我“不幸的是,应用程序已经停止了”。由于它还没有打开,我对这个问题毫无头绪。 你知道什么会导致与吉吉如此不兼容吗? 在Android/app/build.gradle中 编辑1:没有MultiDex应用程序不能编译。在果冻豆上的错误也是一样的。以下是日志: 致命异常:AsyncTask#1java.lang.

  • 如果为android设备设置代理设置,它们是否适用于设备上的所有应用程序(包括浏览器)?或者它们只适用于浏览器? 我问的原因是,当你去更改Android设备上的代理设置有这个消息,它让我困惑:

  • 我有一个奇怪的小问题:如何设置截击中的用户代理? 我需要一些网站的完整版本(桌面版),而不是手机版。 我试图将变量userAgent从“volley/0”改为“Mozilla/5.0(X11;Linux i686)AppleWebKit/537.36(KHTML,比如Gecko)Chrome/27.0.1453.93 Safari/537.36”(我的Chrome)。没什么区别。 有什么建议吗?

  • 如何为每个WebView实例设置代理? 这是我到目前为止所拥有的: 这会启动一个带有谷歌页面的窗口。 但是如何设置代理?不是VM系统代理,而是每个WebView窗口的代理。

  • 我也尝试过这个其他的解决方案。

  • 问题内容: 我正在尝试使用带有URLConnection的Java解析网页。我尝试像这样设置用户代理: 但是最终的用户代理是我指定的,最后附加了“ Java / 1.5.0_19”。有没有一种方法可以在没有此添加的情况下真正设置用户代理? 问题答案: 暂时,将 system属性设置为可以解决问题(我前面没有代码)。 你可能会逃脱: 但这可能需要你与URL协议处理程序的初始化之间进行竞争,如果它在启