2013-05-03 54 views
12

我正在設計一個API,我想知道是否可以在GET請求上發送JSON有效載荷?GET HTTP請求有效載荷

在此的其他問題Payloads of HTTP Request Methods,我們可以根據this link發現:

  • 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" } 
      } 
     } 
    } 
} 
' 

所以,如果這個流行libary做它,沒有人抱怨,那麼也許我可以這樣做?

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


在這裏,我們可以讀到: HTTP GET with request body

Roy Fielding的關於包括機身採用了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 ... 
} 
' 

它看起來罰款嗎?基於上述考慮。


+1

的風險之一將是客戶端庫不允許有效載荷在GE發T請求。老實說,我甚至都沒有意識到你可以用捲曲來做到這一點。 – bdkosher 2013-05-03 13:48:52

回答

1

讓GET響應根據請求的不同而不同,會破壞緩存。不要去那裏。

+0

這是一個API,我不需要緩存,因爲它是通過標識客戶端的OAuth2頭文本化的。不同的客戶端可以具有相同資源URI的不同表示,所以我不能根據資源URI進行緩存 – 2013-05-03 14:49:31

+0

所有中介/庫都知道這一點嗎? – 2013-05-03 14:51:55

+0

肯定是因爲他們需要訪問允許他們操作用戶帳戶的OAuth2令牌。因此,/ profile資源是客戶端擁有OAuth2標記的用戶配置文件(作爲標題給出) – 2013-05-03 15:53:45

1

Google App Engine是一個流行的網頁框架,使用了一個特殊的url獲取庫,其中does not support making HTTP GET requests with a payload。因此,如果您希望您的API訪問Google App Engine用戶,那麼我不會建議要求此行爲。我使用Google打開了an issue regarding this

+0

請注意,如果您需要發出'GET'請求,則可以在'source'查詢字符串參數中對請求主體進行urlencode編碼,而不是將其與請求正文一起發送。 – 2015-04-16 03:49:56

0

僅僅因爲你可以做一些事情,並不意味着你應該。對不起,如果這聽起來很令人反感,但有關標準的事情是,它們是標準 - 而HTTP是最成熟的標準之一。這並不完美,很多人都想改變它,但事實上幾乎每個人都仍然使用URL參數來處理這樣的用例,這對我來說足以說明,沒有現在任何可靠的替代品。

來自speedplane和Julian Reschke的答案給出了兩個具體的例子,如果你依賴於GET/GET/GET/GET/GET/GET/GET/GET/GET/POST請求,如果你願意,你可以以不同的方式爲你的應用程序編寫你的應用程序,但是網絡是一個標準應該比平常更加嚴肅的地方。我知道成爲開拓者很有誘惑力,但要充分尊重,請考慮有多少網站存在,以及有多少網絡程序員正在構建和維護它們。如果有一個明確更好的方法,那麼到目前爲止,你很可能會看到它被廣泛用於生產。

標準改變/被慢慢採用,因爲很多人不得不同意他們的工作。你說的有是破壞規則的應用程序是正確的,但你會注意到它們已經給人們帶來了麻煩,並且在某些情況下需要解決方法/冗餘措施,正如Aetherus在他們對另一個人的評論中提到的那樣回答。我傾向於在這樣的問題上採取阻力最小的路徑。如果你真的想這樣做,我相信你可以讓它工作。

1

另請參閱:HTTP GET with request body - 有關詳細信息。

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

  • 你可能忽略了HTTP規範建議(你可能想POST)
  • 您可能引進緩存問題
  • 這是直觀儘可能的REST API去
相關問題