成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go HTTP GET 請求可以發送 body 嗎

開發 前端
在 GET 類型的請求里使用 body 是一個沒有定義的語義。如果在 GET 請求的 body 里傳遞參數可能會被某些實現方拒絕該請求。

大家好,我是煎魚。

前段時間遇到一個朋友,他跟我說他們在開發一個 Go 項目時,遇到了一個爭議點,說來也好理解。WEB UI 端選擇 GET、POST 類型時,程序是否要區分所傳遞的值(例如:Body),還是不管是什么類型都傳。

圖片圖片

一派認為無所謂,反正都能傳。又沒限制。

一派認為規范如此,不應該傳。應該針對 HTTP POST 類型,使用 POST 請求的 body 來傳遞參數。在 GET 請求里使用 URI 來進行參數傳遞。

看著似乎都有各自的道理,僵持不下。

RFC7231 怎么說

要看互聯網協議的相關標準,必然是 RFC 了。首先看看 RFC7231[1] 中的 4.3.1 小節是怎么說的。

如下摘抄:

A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.

大概意思:在 GET 類型的請求里使用 body 是一個沒有定義的語義。如果在 GET 請求的 body 里傳遞參數可能會被某些實現方拒絕該請求。

也就是這個混著傳的行為并不符合 RFC 規范,至少官方是不推薦不鼓勵這樣的使用方式。但并沒有禁止這個行為。

記住這個結論。接下來我們進行測試。

程序支持程度

我們起一個 HTTP Sever 用于測試和驗證,看看在具體的編程語言的實現中是否可以支持。

如下 Go 代碼:

func hello(w http.ResponseWriter, req *http.Request) {
 b, _ := io.ReadAll(req.Body)
 w.Write(b)
}

func main() {
 http.HandleFunc("/hello_world", hello)
 http.ListenAndServe(":7001", nil)
}

在命令行執行 CURL 進行測試:

$ curl -X GET localhost:7001/hello_world -d '煎魚'
煎魚

看來在 Go 里面是可以的。

那既然 RFC 沒有禁止,Go 的測試也正常??磥砭褪侵皇强陬^上的 “不鼓勵” 和 “不推薦” 嗎?

那別的場景也都支持嗎?

實際上也不是,例如:XMLHttpRequest 規范[2] 中有明確提到:

圖片圖片

如果請求方法為 GET 或 HEAD,body 參數會被忽略。

總結

在 GET 類型里傳 body 參數,從 RFC7231 標準來定義。官方是不推薦、不鼓勵這么去使用的。

但是呢,這是一個沒有明確禁止的事。

而從各個 HTTP 實現的客戶端來看,一開始還是有不少不支持的。但掰扯了好多年后,大多數都支持了。(畢竟用戶的訴求也是很重要的)

甚至印象最深的,ES 直接就在 GET 請求里傳了 body:

圖片圖片

對應的 CURL:

curl -X GET "localhost:9200/my-index-000001/_search?from=40&size=20&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "user.id": "kimchy"
    }
  }
}
'

但也有不支持的,例如在 Chrome 瀏覽器下測試 XMLHttpRequest、Fetch 對此都會忽略或出現報錯。

圖片圖片

Fetch GET body

結論上來講,GET 請求能不能傳 body,這是一個 RFC 規范不鼓勵。但是實現方大部分都支持的一個情況。

企業和團隊內部的話,建議達成研發規范的共識即可。不過我個人而言,都會區分開。

參考資料

[1]RFC7231: https://datatracker.ietf.org/doc/pdf/rfc7231.pdf

[2]XMLHttpRequest 規范: https://xhr.spec.whatwg.org

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2015-08-06 13:33:22

PHPGETPOST

2015-10-27 11:06:51

PHPGETPOST

2010-06-29 13:18:31

HTTP協議

2024-07-05 17:49:29

2022-03-24 14:49:57

HTTP前端

2021-02-09 21:49:51

Python參數Get

2021-03-06 09:54:22

PythonHTTP請求頭

2011-08-03 14:33:54

IOS4.2 HTTP 請求

2021-08-26 06:58:14

Http請求url

2015-01-05 10:07:24

HTTPGETPOST

2018-07-24 13:01:52

前端優化前端性能瀏覽器

2023-03-06 08:37:58

JavaNIO

2021-09-05 18:25:30

Go命令倉庫

2022-01-09 17:38:32

goHttpClient 集群

2022-07-03 17:55:53

HTTP頁面瀏覽器

2020-04-28 11:00:45

Go開源庫HTTP

2022-12-09 08:19:43

HTTP協議MIME

2018-01-04 09:46:48

PHPHTTP

2021-11-11 11:30:11

GET圖片Java

2023-12-04 07:07:36

HTTP請求
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www国产精品 | 国产91 在线播放 | 农夫在线精品视频免费观看 | 特一级毛片 | 中文字幕在线观看视频一区 | 精品国产99 | 亚洲精品一区中文字幕乱码 | 久久乐国产精品 | 成人福利在线 | 国产精品99久久免费观看 | 国产三区精品 | 91看片在线观看 | 国产综合av | 午夜三级视频 | 亚洲成人久久久 | 久久久久久国产精品免费免费男同 | 色视频网站 | 欧美精品一区二区三区在线四季 | 成人午夜视频在线观看 | 成人不卡 | 99免费 | 爱爱视频在线观看 | 久久国| 日韩精品免费视频 | 日韩在线播放一区 | 天堂一区二区三区 | 国产精品免费看 | 久久久久一区二区三区四区 | 久久九九网站 | 国产精品一区二区视频 | 欧美午夜激情在线 | 在线免费中文字幕 | 中文字幕综合 | 国产偷录叫床高潮录音 | 午夜精品| 精品亚洲一区二区 | 国产在线对白 | 成人在线看片 | 一区二区三区国产精品 | 精品久久国产视频 | 中文字幕视频三区 |