HttpsURLConnection 返回 400
大家好,我是烤鴨:
????記一次 由 HttpsURLConnection 引起的返回值400的錯誤。
1. ??場景復現
?? ? 今天線上調用第三方接口的時候突然報錯了。
?? ? 嚴格來說也不是報錯,就是發的請求不通了,http報400的錯誤。
?? ? 問了下對接方,也沒有改代碼,我們這邊也沒什么大的改動。
?? ? 奇了怪了。。。
?? ? 這是請求原來的代碼
這是改動的地方,加了句log。
OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8"); log.info("【返回值】"+conn.getResponseCode()); osw.write(reqStr); osw.flush(); osw.close();2.????尋找問題
????把改動的地方逐步還原,最后發現是log的問題。
?? ?log是沒有問題,問題在于 conn.getResponseCode()。
?? ?conn.getOutputStream() 獲取連接的輸出流,準備向對方發送(寫入)數據的時候,
?? ?調用conn.getResponseCode() 報錯。為什么呢。一步步看。
getInputStream方法中調用的是getInputStream0()。
public synchronized InputStream getInputStream() throws IOException {this.connecting = true;SocketPermission var1 = this.URLtoSocketPermission(this.url);if (var1 != null) {try {return (InputStream)AccessController.doPrivilegedWithCombiner(new PrivilegedExceptionAction<InputStream>() {public InputStream run() throws IOException {return HttpURLConnection.this.getInputStream0();}}, (AccessControlContext)null, var1);} catch (PrivilegedActionException var3) {throw (IOException)var3.getException();}} else {return this.getInputStream0();}}? ?getInputStream0方法中?
? ??
? ? if setDoInput(true)
? ? if else 拋出rememberedException異常
? ? if else 輸入流不為空
? ? else 輸出的方式是否是流的形式
? ? 往對應的服務器寫一段文字,主要調用的是這個方法
? ? writeRequests,看是否正常響應,響應后關閉流。
? ? 看到這大概就明白了。
3.????總結
????調用 conn.getOutputStream() 獲取連接的輸出流,等待內容寫入。(連接是阻塞的,BIO)
?? ?此時調用 conn.getResponseCode() 會向服務器寫入其他的東西(一個8192byte的字符串),
?? ?寫入完成后,flush 再close。這時對接方的服務器發現獲取到的東西并不是指定格式傳輸的內容,
?? ?就報400了。
? ? 關于400的說明——?HTTP 400 錯誤 - 請求無效 (Bad request);出現這個請求無效報錯說明請求沒有進入到后臺服務里
? ? https://www.cnblogs.com/beppezhang/p/5824986.html
?? ?不能忽略每一次小的改動。一句小小的log都可能導致問題,還有就是要多測試。
?
總結
以上是生活随笔為你收集整理的HttpsURLConnection 返回 400的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Install OpenStack Ki
- 下一篇: WPF中StringToImage和Bo