国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

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

2019-12-12 02:06:08
字體:
供稿:網(wǎng)友

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

問題描述:

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

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

什么?怎么和wifiSsid有關(guān)系了?后來查了一下代碼,發(fā)現(xiàn)確實(shí)在登錄接口上通過請求頭的形式上傳了 wifissid, 也就是連接的wifi的名字。Exception描述是第四個 char ,也就是“免”字?難道是因?yàn)橹形牡脑颍慨?dāng)時是這么猜測的。

源碼查詢

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

在okhttp的源碼Header.java,發(fā)現(xiàn)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都是不能含有中文的,一旦判定為有中文的出現(xiàn),就會拋出異常,中斷請求。

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

解決方案:

解決方案有以下幾種:

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

總結(jié)

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桐柏县| 会同县| 六盘水市| 松桃| 扎囊县| 长治市| 栾川县| 盐津县| 泽库县| 于都县| 新巴尔虎右旗| 贵州省| 依安县| 乌海市| 孟连| 扎兰屯市| 三台县| 健康| 盘锦市| 淳安县| 信宜市| 鄂托克前旗| 长沙市| 临清市| 遂溪县| 无为县| 若羌县| 门源| 施秉县| 海城市| 大关县| 承德市| 古田县| 宁国市| 余庆县| 大宁县| 卓资县| 涟水县| 香河县| 永寿县| 普格县|