2012-11-07 106 views
14

可能重複:
HTTP GET with request body春天RestTemplate - HTTP GET請求與身體

我在這裏讀幾討論不提倡通過HTTP GET發送內容。可以通過客戶端(網絡瀏覽器)發送的數據大小有限制。處理GET數據也取決於服務器。請參考下面的資源

但是,我被要求測試使用RestTemplate通過HTTP GET發送內容的可能性。我在春季論壇上討論了一些討論,但他們沒有回答。 (請注意通過http Post發送數據正常工作)。討論here建議使用POST代替。

開發ENV - JBoss應用服務器5.1,春季3.1.3

客戶

@Test 
public void testGetWithBody() 
{ 
    // acceptable media type 
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN); 

    // header 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(acceptableMediaTypes); 

    // body 
    String body = "hello world"; 
    HttpEntity<String> entity = new HttpEntity<String>(body, headers); 

    Map<String, Object> uriVariables = new HashMap<String, Object>(); 
    uriVariables.put("id", "testFile"); 

    // Send the request as GET 
    ResponseEntity<String> result = restTemplate.exchange(
      "http://localhost:8080/WebApp/test/{id}/body", 
      HttpMethod.GET, entity, String.class, uriVariables); 

    Assert.assertNotNull(result.getBody()); 
} 

服務器 @Controller

@RequestMapping(value = "/{id}/body", method = RequestMethod.GET) 
public @ResponseBody 
String testGetWithBody(@PathVariable String id, 
     @RequestBody String bodyContent) 
{ 
    return id + bodyContent; 
} 

問題 - 執行該測試案件返回50 0內部服務器錯誤。在調試時,我發現控制器沒有被擊中。

  1. 是否正確理解RestTemplate提供了發送數據請求體的方式,但出現錯誤的原因是服務器無法處理請求的身體嗎?

  2. 如果通過HTTP Get發送的請求體不是常規的,爲什麼RestTemplate會提供允許發送它的API?這是否意味着很少有服務器能夠通過GET處理請求主體?

資源 - 對在春季論壇

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

Resourc使用RestTemplate通過HTTP GET發送體的討論ES - 通過HTTP發送體一般討論GET

get-with-request-body

is-this-statement-correct-http-get-method-always-has-no-message-body

get-or-post-when-reading-request-body

http-uri-get-limit

+0

as不允許在標記爲重複的問題中發帖回答我會在這裏導致花費大量時間來弄清楚如何去做 您可以使RestTemplate通過使用Apache的http客戶端與一些調整: – LifeIsGoodMF

+0

class HttpGetWithBody extends HttpEntityEnclosingRequestBase {HttpGetWithBody(final URI uri){ setURI(uri); } @Override public String getMethod(){ return HttpGet.METHOD_NAME; } } – LifeIsGoodMF

+0

HttpComponentsClientHttpRequestFactory requestFactory =新HttpComponentsClientHttpRequestFactory(){ @覆蓋 保護HttpUriRequest createHttpUriRequest(列舉HTTPMethod列舉HTTPMethod,URI URI){ 如果(列舉HTTPMethod == HttpMethod.GET){ 返回新HttpGetWithBody(URI); } return super.createHttpUriRequest(httpMethod,uri); } }; – LifeIsGoodMF

回答

6

是否正確理解RestTemplate提供方式發送數據爲請求正文,但發生錯誤是因爲服務器無法處理請求正文?

通過查看網絡流量(請求是否與請求主體和GET方法一起發送?)和服務器日誌(您收到的500結果必須具有記錄的服務器端效果如果沒有,請將服務器配置爲這樣)。

如果通過HTTP Get發送的請求體不是常規的,爲什麼RestTemplate會提供允許發送它的API?這是否意味着很少有服務器能夠通過GET處理請求主體?

因爲它是一個通用類,它還允許您創建可包含消息正文的請求。

HTTP GET with request body指出:

換句話說,任何HTTP請求消息允許包含消息體,因此[服務器]必須考慮到這一點解析消息。但是,GET的服務器語義受到限制,因此主體(如果有)對請求沒有語義含義。解析的要求與方法語義的要求是分開的。

一個身體上的GET 不能做任何語義的,因爲你是請求的資源。這就像你告訴服務器:「給我資源X,哦,並有一些蘋果!」。服務器不會關心你的蘋果,並且很樂意爲X提供資源 - 或者拋出錯誤,因爲它不喜歡請求中的任何提議。

不過,我被邀請測試的可能性通過HTTP GET發送內容

請告訴誰要求這一點,這是不應該進行測試的情況下的一個,因爲沒有明智的實施支持它。

+0

感謝CodeCaster的快速響應!雖然,POST似乎是要實施的方法,但我會配置服務器來檢查日誌。 –

+0

有時將查詢參數作爲json對象實現並放入主體而不是url中會更方便。在這種情況下,服務器對蘋果感興趣。 – nevster

+0

(這並不意味着它是一個好主意。) – nevster