摘要:除非使用了分塊編碼,否則首部就是帶有實體主體的報文必須使用的。
背景
新項目上線, 發現一個奇怪的BUG, 請求接口有很小的概率返回400 Bad Request,拿到日志記錄的請求的參數于POSTMAN中測試請求接口, 發現能夠正常響應.
排查過程首先服務器能夠正常響應400 Bad Request, 排除接口故障問題.
對比日志過程中發現
{ "hello":"world" }
接口能夠正常響應業務數據.
{ "hello":"world", "kw":"我是八阿哥" }
則接口返回400錯誤,接口的請求方式均為post json,于是開始review代碼.發現在發送請求時設置了Content-Length,在含中文字符的情況下接口均返回400,定位到原因.請求的偽代碼如下
let param = { "hello":"world", "kw":"我是八阿哥" } let _options = { headers: { "Content-Type": "application/json", "Content-Length": JSON.stringify(param).length }, url: url, method: "POST", json: true, time: true, timeout: 5 * 1000, body: param } return new Promise((resolve,reject)=>{ request(_options,(error, response, body)=>{ ///XXXX ]) })分析結果
首先, 來說說什么是Content-Length,在http的協議中Content-Length首部告訴瀏覽器報文中實體主體的大小。這個大小是包含了內容編碼的,比如對文件進行了gzip壓縮,Content-Length就是壓縮后的大?。ㄟ@點對我們編寫服務器非常重要)。除非使用了分塊編碼,否則Content-Length首部就是帶有實體主體的報文必須使用的。使用Content-Length首部是為了能夠檢測出服務器崩潰而導致的報文截尾,并對共享持久連接的多個報文進行正確分段.
其次,為什么含有中文字符的請求參數返回400,因為Content-Length是計算請求參數的字節數,而非字符數.而JSON.stringify(param).length返回的是字符數.含中文字符的情況下
console.log("八阿哥".length) //3, 即3個字符
console.log(Buffer.byteLength("八阿哥", "utf8")); //9, utf-8編碼下,一個漢字是3字節存儲的
導致接口層拿到的Content-Length小于真實的字節長度, 因而無法正確的解析數據, 從而返回400 Bad Request.因此需要將設置Content-Length的長度改為Buffer.byteLength(JSON.stringify(param),"utf8")
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26065.html
摘要:背景項目中通過遠程調用服務框架調用了許多其它的服務其中有一個服務需要升級其升級不是版本上的升級而是整個服務重新取了一個名字使用的也是全新的包但是調用的方法沒有改變因此在升級時只是在調用服務類中修改了調用地址和調用返回實體由改為該中返回該調用 背景 項目中通過遠程調用服務框架調用了許多其它的服務,其中有一個服務wx/subscribe/contract/CircleService 需要升...
摘要:項目組長給我看了一道面試別人的面試題。打鐵趁熱,再來一道題來加深下理解。作者以樂之名本文原創,有不當的地方歡迎指出。 showImg(https://segmentfault.com/img/bVbur0z?w=600&h=400); 剛入職新公司,屬于公司萌新一枚,一天下午對著屏幕看代碼架構時。BI項目組長給我看了一道面試別人的JS面試題。 雖然答對了,但把理由說錯了,照樣不及格。 ...
摘要:在群里討論,然后得出了這幾種寫法,感覺是層層遞進,想了想,最后選擇發布成文章大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯吃完了背小頭兒子回去正在牽著的手正在吃給所有對象擴展一個繼承的方法繼承爸爸要繼承人的功能正在 在群里討論JavaScript,然后得出了這幾種寫法,感覺是層層遞進,想了想,最后選擇發布成文章 ({ baby : 大頭兒子, ...
摘要:但是在這個判斷的情況下,則會很神奇的發現打印出來了,說明此時為,為什么呢因為這里執行了一個對象到布爾值的轉換故返回。 ????之前做項目的時候,總會處理各式各樣的數據,來進行繪圖。但是當后臺返回一個空數組的時候,頁面中并不會顯示沒有數據的圖。代碼如下: var arr = [] if(arr){console.log(124)}else{console.log(無數據)} 我明明判斷了...
閱讀 2237·2019-08-30 10:51
閱讀 790·2019-08-30 10:50
閱讀 1473·2019-08-30 10:49
閱讀 3137·2019-08-26 13:55
閱讀 1602·2019-08-26 11:39
閱讀 3418·2019-08-26 11:34
閱讀 1945·2019-08-23 18:30
閱讀 3385·2019-08-23 18:22