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: 表示瀏覽器的版本號。

知識擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章