標籤:tcp show chunk 產生 調用 ret 持久化 return provision
先來看看http協議1.0和1.1的區別:
1.0:HTTP 1.0規定瀏覽器與伺服器只保持短暫的串連,瀏覽器的每次請求都需要與伺服器建立一個TCP串連,伺服器完成請求處理後立即斷開TCP串連,伺服器不跟蹤每個客戶也不記錄過去的請求:
1.1:HTTP 1.1支援持久串連,在一個TCP串連上可以傳送多個HTTP請求和響應,減少了建立和關閉串連的消耗和延遲。
再看看java裡面return的作用:
return語句主要有兩個用途:一方面用來表示一個方法返回的值(假定沒有void傳回值),另一方面是指它導致該方法退出,並返回那個值。
問題:
在開發過程中,本地測試全部通過,但是發布到線上,發現直接用postman能訪問請求且能拿到值(待定),但是在nginx代理後,用網域名稱訪問就報錯,錯誤為provisional headers are shown,開始覺得nginx代理有問題,
但是查到最後發現,postman發送get請求沒有問題,但是post就有問題;找到代碼發現所有的post傳回值是void。但是這個應該不影響啊。於是乎,把所有請求為void的該為string,發現好了!!!!!
過程:
在解決問題中,發現在發送post的過程有兩個標誌位
1、是transfer-encoding的值為chunked,來解釋下含義:有時候服務產生HTTP回應是無法確定訊息大小的,比如大檔案的下載,或者後台需要複雜的邏輯才能全部處理頁面的請求,這時用需要即時產生訊息長度,伺服器一般使用chunked編碼。在進行Chunked編碼傳輸時,在回複訊息的Headers有transfer-encoding域值為chunked,表示將用chunked編碼傳輸內容。
2、Content-Length 代表請求的內容長度
總結:
http協議在1.1情況下,是持久化連結,但是我們程式中的post是用的傳回值是void,請求就會一直等待後台給一個返回標誌位,但是後台在執行方法後就結束了。(預設會調用return方法,架構為什麼不掉用?)所以請求會報provisional headers are shown這個錯誤。當你加上return的時候,就不會報錯。
解決辦法:1)方法傳回值加上return,標誌結束。2)修改方法返回header,3)改變nginx裡面的http請求版本。
http協議版本和java傳回值討論