91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解okhttp3 請求頭不能為中文的坑

發布時間:2020-10-09 00:35:53 來源:腳本之家 閱讀:251 作者:禤小軒 欄目:移動開發

對源碼有一定的了解,以為基本可以駕馭了,誰知道,坑來了。

問題描述:

上線接口的某一天,有用戶報障,說登錄不上,而且陸續有報障。

通過log 發現登錄不上,都有一個類似的報錯:
“java.lang.IllegalArgumentException: Unexpected char 0x514d at 4 in wifiSsid value: "360免費WiFi-DP" at ”

什么?怎么和wifiSsid有關系了?后來查了一下代碼,發現確實在登錄接口上通過請求頭的形式上傳了 wifissid, 也就是連接的wifi的名字。Exception描述是第四個 char ,也就是“免”字?難道是因為中文的原因?當時是這么猜測的。

源碼查詢

猜測并不能作為判斷的標準,然后做了一下測試,果然連接含義中文名字的wifi就有問題,也就是不能添加中文到請求頭里面。這是為什么呢?最后還是通過源碼進行的求證:

在okhttp的源碼Header.java,發現set 和add header, 都會有這個判斷:

  private void checkNameAndValue(String name, String value) {
   if (name == null) throw new NullPointerException("name == null");
   if (name.isEmpty()) throw new IllegalArgumentException("name is empty");
   for (int i = 0, length = name.length(); i < length; i++) {
    char c = name.charAt(i);
    if (c <= '\u0020' || c >= '\u007f') {
     throw new IllegalArgumentException(Util.format(
       "Unexpected char %#04x at %d in header name: %s", (int) c, i, name));
    }
   }
   if (value == null) throw new NullPointerException("value == null");
   for (int i = 0, length = value.length(); i < length; i++) {
    char c = value.charAt(i);
    if ((c <= '\u001f' && c != '\t') || c >= '\u007f') {
     throw new IllegalArgumentException(Util.format(
       "Unexpected char %#04x at %d in %s value: %s", (int) c, i, name, value));
    }
   }
  }

嗷,No,果然是這樣,踩到深坑了。無論是header的 Key 和Value都是不能含有中文的,一旦判定為有中文的出現,就會拋出異常,中斷請求。

后面想了一下,以前使用okhttp2的時候,也有上傳相同的請求頭,為什么就沒有這個問題呢?也同樣去查看了一下okhttp2的源碼,發現這個判斷是okhttp3才有的,okhttp2其實并沒有這個判斷。

解決方案:

解決方案有以下幾種:

  • 不要傳了(當然這個不符合需求)
  • 把源碼這個地方改了(也不是太好,不知道會不會引起其他問題)
  • 把中文 encode以下(相對較好的辦法):
ssid = URLEncoder.encode(ssid);

總結

遇到問題不可怕,主要是要做好分析,及時解決,多做總結,避免后門再次踩同樣的坑。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大厂| 莱西市| 饶河县| 慈溪市| 德惠市| 尚义县| 会泽县| 宜丰县| 博野县| 比如县| 集贤县| 张家界市| 广平县| 永兴县| 航空| 牡丹江市| 崇仁县| 沂水县| 江门市| 巴楚县| 宁城县| 枣强县| 桦南县| 芦溪县| 罗山县| 博白县| 滕州市| 四子王旗| 景谷| 茶陵县| 中牟县| 新巴尔虎右旗| 修武县| 延边| 临武县| 轮台县| 湖北省| 措勤县| 乌拉特中旗| 剑川县| 宜阳县|