Android进阶之路 - 网络请求中user-agent的使用

首次听到user-agent的概念,及时来恶补一下~

如使用场景在WebView内,即可关注下我那些关于WebView的回忆 ~ 包含入门使用、优化加载样式、监听加载状态、各场景后退键处理、俩端交互流程、header、user-agent传值、交互常见问题、较全API整合

user-agent介绍

User-Agent简称UA,中文名为用户代理,是Http请求协议中请求头的一部分,这里的请求包括GET请求和POST请求

user-agent作用

  • 在手机端/pc端,可以通过user-agent来判断不同的设备,从而可以显示不同的排版,进而给用户提供更好的体验
    例如:用手机访问百度和pc端访问的页面排版是不一样的,这些就是百度根据访问者的UA来判断的

  • 通过user-agent,进行信息统计,主要是用于渠道统计
    例如:在之前的工作中碰到过类似情况,在app中接入广告的sdk,当用户点击广告图片时就需要通过webview进行详细广告页面的跳转,这时候就需要在webview中进行UA的自定义设置了,这样后台广告平台的人员就可以通过UA判断是哪个客户端(安卓/苹果),哪个浏览器的客户,进而进行客户端的统计

常规网络请求

一般移动端的网络请求,在头部都默认添加了user-agent,如果我们要在网络请求中修改user-agent的参数,那么我们就需要在自我封装的网络框架基层内重写user-agent!

下面我们以okhttp、Retrofit为例 ~

okhttp初始化

OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request()
                            .newBuilder()
                            .removeHeader("User-Agent")//移除旧的
                            //WebSettings.getDefaultUserAgent(mContext) 是获取原来的User-Agent
                            .addHeader("User-Agent",“上面得到的User-Agent” )
                            .build();
                    return chain.proceed(request);
                }
            })
            .connectTimeout(2, TimeUnit.MINUTES)
            .writeTimeout(2, TimeUnit.MINUTES)
            .readTimeout(2, TimeUnit.MINUTES)
            .build();

Retrofit初始化

OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request()
                            .newBuilder()
                            .removeHeader("User-Agent")//移除旧的
                            .addHeader("User-Agent", WebSettings.getDefaultUserAgent(mContext))
                            .build();
                    return chain.proceed(request);
                }
            })
            .connectTimeout(2, TimeUnit.MINUTES)
            .writeTimeout(2, TimeUnit.MINUTES)
            .readTimeout(2, TimeUnit.MINUTES)
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("/BaseUrl")
            .client(okHttpClient)//采用okhttpclient
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

WebView网络请求

user-agent的获取和设置

  • webView获取user-agent
 WebView webView = findViewById(R.id.webview);
 WebSettings webSettings = webView.getSettings();
 String userAgentString = webSettings.getUserAgentString();
 LogUtil.e("userAgentString=",userAgentString);
  • 重设user-agent

场景1.尾部添加字段

 webSettings.setUserAgentString(userAgentString + "自定义内容");

场景2.替换原来的user-agent (可选自己喜欢的方式)

//replace替换方式
webSettingssetUserAgentString(userAgentString .replace("Android","HFWSH_USER Android"));
//覆盖重设方式
 webSettings.setUserAgentString("自定义内容");

user-agent数据分析

  • user-agent 完整数据
Mozilla/5.0 (Linux; Android 8.1.0; PACM00 Build/O11019; wv) AppleWebKit/537.36
(KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36
  • user-agent → 四个分段 → 参数介绍
1)Mozilla/5.0 :表示兼容Mozilla, 几乎所有的浏览器都有这个字符;
2) (Linux; Android 8.1.0; PACM00 Build/O11019; wv): 表示设备的操作系统版本,以及CPU信息;
3)AppleWebKit/537.36 (KHTML, like Gecko):表示浏览器的内核;
4) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36: 表示浏览器的版本号。

知识扩展

发布了247 篇原创文章 · 获赞 97 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/100558143
今日推荐