真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

go語言調用http請求的簡單介紹

golang中http請求體多次讀取的坑

報錯信息如下:

創(chuàng)新互聯(lián)是專業(yè)的密云網站建設公司,密云接單;提供網站制作、成都網站設計,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行密云網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

[logid: 3628171316][json.err: EOF] [exception:EOF] goroutine 20521 [running]:

原因:

在請求體為json的請求中,調用了parsePostForm方法,方法大致內容如下:

在這個方法中,會讀取http的請求體。

在這里被讀取的時候,后面又重新讀取一次,之后解json

后面讀到的請求體是空的,解json的時候就會報錯EOF

總結:golang中http請求報錯eof,多半是因為多次讀取了請求體

golang net/http包 http請求的字節(jié)碼讀取與解析。

先配置Header最長讀取時間、req最長讀取時間、req最大讀取長度默認6M。

RFC7230禁止\r\n參數,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。但go net/http包放寬了這個要求。

先構建newTextprotoReader,由于緩沖區(qū)是對象復用的,用完后要defer put。共完以以下解析任務:

TextprotoReader數據結構,將字節(jié)碼Reader轉成文本Reader。

第一步,從第一行解析出method uri prototype。

第二步解析URL。url.URL數據結構:

解析Scheme,協(xié)議前綴(小寫)。有查詢參數?,則配置url.ForceQuery url.RawQuery。有認證信息///...//,則解析url.User url.Host。最后配置url.Path和url.RawPath,如果Path==RawPath,則RawPath=""。

第三步解析MIMEHeader。

第四步readTransfer。重新配置如下參數:RequestMethod ProtoMajor ProtoMinor Header Trailer ContentLength Close。對于Body,如果encodings支持chunked,讀取流用chunkedReader包裹。默認情況用LimitedReader,無body賦空的struct{}。

以下情況返回非空err,示得到正確的請求:

最后配置req.ctx req.RemoteAddr req.TLS body.doEarlyClose = true。

構建Response:

其中closeNotifyCh必須在構建時初始化,沒有content所以先置contentLength為-1。

配置w.cw并被w.w包裹。w.cw緩沖默認大小2M。

獲取Request可能出現如下錯誤:

先上響應數據結構:

response字段可以分類為:大對象、緩沖、KV對或bool型的狀態(tài)參數。

大對象有:

狀態(tài)字段:

chunkWriter數據結構:

chunkWriter包裹了Response,功能之一是完成Header設置,包括Content-Type Content-Length chunk-header。bufio.Writer是chunkWriter是緩沖包裹。

handler將響應寫入到response.w。

調用w.w.Flush()將w寫入到cw,注意到Flush()操作,如果未刷空緩存并報錯,觸發(fā)拷貝操作。報錯不會退回已寫出的數據。

進而調用cw.Write(),根據cw.chunking參數。

putBufioWriter(w.w)清空resp.w緩沖,如果池化放回sync.pool。

根據chunkWriter的定義,w.cw.close()負責cw的結束工作:寫入換行符和resp.trailers數據。

最后刷新TCP緩沖w.conn.bufw.Flush(),完成響應包發(fā)送。并正確關閉request。

【golang】context上下文與http請求妙用

1.在后端服務開發(fā)中,如過一個HTTP請求,請求一致占用,將會帶來大的性能影響,所以需要為每個請求加上超時設置

2.在go語言中利用 context 進行上下文控制,要想達到精確時間控制,如下:

3.同時我們也可以利用context的context.WithDeadline()函數來進行超時控制


本文標題:go語言調用http請求的簡單介紹
當前URL:http://weahome.cn/article/hephci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部