簡體   English   中英

GET請求主體中的RESTful Web服務和JSON文檔

[英]RESTful web services and JSON document in GET request body

我需要將復雜的JSON文檔從客戶端應用程序( AngularJS )發送到服務器端( JavaSpring MVC/Rest ),以便檢索所需的信息。

這是JSON示例:

[
   {
      "operator":"AND",
      "queries":[
         {
            "value":10,
            "comparisonOperator":"\u003e\u003d",
            "characteristicId":391
         },
         {
            "value":50,
            "comparisonOperator":"\u003c\u003d",
            "characteristicId":391
         }
      ],
      "characteristicId":391
   },
   {
      "value":true,
      "comparisonOperator":"\u003d",
      "characteristicId":383
   }
]

我的客戶端應用程序通過RESTful Web服務與后端進行通信。 對於數據檢索,我使用GET方法,並將url與path / query參數一起使用。

我不確定如何處理必須獲取數據並提供上述JSON文檔的情況。

:可以在GET請求正文中包含這種JSON嗎? 如果沒有,解決此問題的最佳方法是什么?

無論如何,由於本文檔的架構較少,我無法使用路徑/查詢參數更改此JSON

我不會在GET有效負載中發送JSON。 對於GET請求,有效負載沒有定義的語義,某些服務器可能會拒絕該請求。 為了支持它,這是RFC 7231的引言,它是HTTP / 1.1協議的語義和內容的當前參考:

4.3.1。 得到

[...]

GET請求消息中的有效負載沒有定義的語義。 GET請求上發送有效內容正文可能會導致某些現有實現拒絕該請求。

[...]

Elasticsearch是基於Lucene的搜索引擎,支持帶有有效負載的GET請求 ,但我會堅持使用標准。

其他選項是:

發送JSON作為查詢參數

如果采用這種方法,則參數值必須經過URL編碼。 對於您在問題中發布的JSON,它將是http://example.org/api?query=%5B%7B%22operator%22%3A%22AND%22%2C%22queries%22%3A%5B%7B%22value%22%3A10%2C%22comparisonOperator%22%3A%22%3E%3D%22%2C%22characteristicId%22%3A391%7D%2C%7B%22value%22%3A50%2C%22comparisonOperator%22%3A%22%3C%3D%22%2C%22characteristicId%22%3A391%7D%5D%2C%22characteristicId%22%3A391%7D%2C%7B%22value%22%3Atrue%2C%22comparisonOperator%22%3A%22%3D%22%2C%22characteristicId%22%3A383%7D%5D

使用POST執行搜索

您可以假定搜索是一種資源,並使用POST將請求有效負載中的JSON發送到服務器。

問:可以在GET請求正文中包含這種JSON嗎? 如果沒有,解決此問題的最佳方法是什么?

盡管GET請求在技術上可以具有body ,但我不建議依賴於此。 在我看來,這與HTTP協議的性質背道而馳。

我認為您應該向一些/xxx/query資源發布請求,以執行復雜的查詢。

在GET請求中包含正文是可以的。 所有HTTP客戶端發出這樣的請求都應該沒有問題。 請注意,您執行的操作應是冪等的,並且沒有副作用。 換句話說,應該是查詢,而不是修改服務器狀態的操作。

請參閱https://spring.io/understanding/REST#get了解RESTfull獲取的基本規則。

檢索信息。 GET請求必須是安全且冪等的,這意味着無論使用相同參數重復執行多少次,結果都是相同的。

我不會在查詢參數中發送編碼的JSON。 它將完全不可讀(由於編碼),因此無用。 由於通常在Web服務器日志中可以找到請求正文,因此它也可能不安全並顯示過多信息。

最后,對於某些請求,您可能會達到URL大小的限制(具體取決於客戶端庫和服務器實現,但是URL大小的限制往往比主體大小的限制要短得多。

問:可以在GET請求正文中包含這種JSON嗎? 如果沒有,解決此問題的最佳方法是什么?

您需要考慮兩個問題:

  • GET URL長度可能超過最大長度。 可以持續多長時間取決於實現方式。 看到

  • 您需要對查詢字符串中的JSON進行URL編碼

除此之外,你應該沒事。

您可以將json添加為HTML編碼的參數值。 這可能會使URL非常長,可能超過最大URL長度限制,因此應將其視為不可靠的方法。 如果最終用戶不會直接使用您的URL,那么可讀性並不是真正的問題,但是如果他們直接使用URL,則使URL盡可能短應該是一個目標。 另一方面,如果沒有該JSON的話頁面的關鍵功能將無法工作,則可能會鼓勵將其用作GET參數值,並可能使用base64或其他方式對其進行加密。

通常,我將這種long值作為POST參數傳遞,但是從上面您可以看到一些例外。

從技術上講,這應該可行,但長JSON可能會出現問題。

暫無
暫無

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

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