簡體   English   中英

GET HTTP請求有效負載

[英]GET HTTP request payload

我正在設計一個API,我想知道在GET請求上發送JSON有效負載是否合適?

在這個其他問題的HTTP請求方法的有效載荷 ,我們可以根據這個鏈接找到:

  • HEAD - 沒有定義的正文語義。
  • GET - 沒有定義的正文語義。
  • PUT - 支持身體。
  • POST - 支持身體。
  • DELETE - 沒有定義的正文語義。
  • TRACE - 不支持身體。
  • 選項 - 支持身體但沒有語義(可能在將來)。

這是否意味着我不應該發送帶有效負載的GET請求? 這樣做有風險嗎?

  • 就像讓一些HTTP客戶端庫無法發送這樣的有效載荷?
  • 或者我的Java API代碼無法在某些應用程序服務器上移植?
  • 還要別的嗎?

我發現ElasticSearch在GET請求上使用了這樣的有效負載:

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
    "query": {
        "filtered" : {
            "query" : {
                "query_string" : {
                    "query" : "some query string here"
                }
            },
            "filter" : {
                "term" : { "user" : "kimchy" }
            }
        }
    }
}
'

因此,如果這個受歡迎的圖書館沒有人抱怨,那么也許我可以做同樣的事情嗎?

順便說一句, 我想知道混合queryString參數和JSON有效負載是否可行? 就像這個ElasticSearch查詢一樣。 如果是這樣,是否有規則,以便我們知道哪些參數應該是queryString參數或有效負載參數?


在這里我們可以閱讀: 帶有請求體的HTTP GET

羅伊菲爾丁關於將一個機構納入GET請求的評論。

是。 換句話說,任何HTTP請求消息都允許包含消息體,因此必須解析消息。 但是,GET的服務器語義受到限制,使得正文(如果有的話)對請求沒有語義含義。 解析的要求與方法語義的要求是分開的。

所以,是的,你可以使用GET發送一個正文,不,這樣做永遠不會有用。

這是HTTP / 1.1的分層設計的一部分,一旦規范被分區(正在進行中),它​​將再次變得清晰。

羅伊....

然后我真的不明白為什么它永遠不會有用,因為在我看來,將復雜的查詢發送到服務器上是不合適的,這些查詢不適合queryParam或matrixParam。 我認為ElasticSearch API設計師的想法是一樣的......


我打算設計一個可以這樣調用的API:

curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'

curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'

curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
    "someSearchFilter1":"filterValue1",
    "someSearchFilter2":"filterValue2",
    "someSearchFilterList": ["filterValue3","xxx"]
    ... a lot more ...
}
'

你覺得好嗎? 基於以上考慮。


根據請求正文的GET響應會有所不同會破壞緩存。 不要去那里。

Google App Engine是一種流行的Web框架,它使用特殊的url fetch庫,它不支持使用有效負載發出HTTP GET請求 因此,如果您希望API能夠覆蓋Google App Engine用戶,那么我不建議您要求此行為。

我已經用谷歌打開了這個問題

另請參閱: 帶請求正文的HTTP GET - 有關詳細信息。

要點是:是的,你可以,但你可能不應該出於各種原因,包括:

  • 您可能忽略了HTTP規范建議(您可能想要POST)
  • 您可以介紹緩存問題
  • 就REST API而言,這並不直觀

僅僅因為你可以做某事,並不意味着你應該做 我很抱歉,如果這聽起來令人憤怒的重復,但關於標准的事情是它們是標准的 - 而HTTP是最成熟的標准之一。 它並不完美,很多人都希望改變它的很多東西,但幾乎每個人仍在使用URL參數這樣的事實對我來說是充分的跡象表明沒有任何可靠的替代品現在。

來自speedplane和Julian Reschke的答案提供了兩個具體的例子,如果您依賴於具有正文/有效負載的GET請求,這些事情將會中斷。 如果您願意,您可以以不同的方式為您的應用編寫應用程序,但網絡是標准應該比正常情況更嚴重的標准。 我知道成為一名開拓者很有吸引力,但要充分尊重,請考慮存在多少網站,以及有多少網絡程序員在構建和維護它們。 如果有一個明確的更好的方法,你很可能會看到它現在廣泛用於生產。

標准變化/被慢慢采用,因為很多人必須同意這些標准才能讓他們工作。 你是說,有一些違反規定的應用程序是正確的,但你會發現他們已經頭疼不已的人,並須在某些情況下的解決方法/冗余措施,如通過Aetherus在其上的另一個答案評論中提及。 在這樣的問題上,我傾向於采取阻力最小的道路。 如果你真的想這樣做,我相信你可以讓它成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM