日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpsURLConnection 返回 400

發布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpsURLConnection 返回 400 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,我是烤鴨:
????記一次 由 HttpsURLConnection 引起的返回值400的錯誤。

1. ??場景復現


?? ? 今天線上調用第三方接口的時候突然報錯了。
?? ? 嚴格來說也不是報錯,就是發的請求不通了,http報400的錯誤。
?? ? 問了下對接方,也沒有改代碼,我們這邊也沒什么大的改動。
?? ? 奇了怪了。。。
?? ? 這是請求原來的代碼

HttpsURLConnection conn = (HttpsURLConnection) reqURL.openConnection(); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Accept", "*/*"); conn.setRequestProperty("User-Agent", "stargate"); conn.setRequestProperty("Content-Type", "application/json"); OutputStreamWriter osw = new OutputStreamWriter(conn.getOutputStream(), "utf-8"); osw.write(reqStr); osw.flush(); osw.close();

這是改動的地方,加了句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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。