2012-11-07 40 views
14

thể trùng lặp:
HTTP GET with request bodyXuân RestTemplate - http GET với yêu cầu cơ thể

Tôi đã đọc vài cuộc thảo luận ở đây mà không chủ trương gửi nội dung qua HTTP GET. Có những hạn chế về kích thước của dữ liệu có thể được gửi qua máy khách (trình duyệt web). Và việc xử lý dữ liệu GET cũng phụ thuộc vào các máy chủ. Vui lòng tham khảo phần Tài nguyên bên dưới.

Tuy nhiên, tôi đã được yêu cầu kiểm tra khả năng gửi nội dung qua HTTP GET bằng cách sử dụng RestTemplate. Tôi đã giới thiệu vài cuộc thảo luận trên diễn đàn mùa xuân nhưng họ không được trả lời. (Xin lưu ý gửi dữ liệu qua http Post hoạt động tốt). Cuộc thảo luận here đề xuất sử dụng POST thay thế.

dev env - JBoss AS 5.1, Spring 3.1.3

Khách hàng

@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()); 
} 

server @Controller

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

Vấn đề - thực hiện xét nghiệm này trường hợp trả về 50 0 Lỗi máy chủ nội bộ. Khi gỡ lỗi, tôi thấy rằng bộ điều khiển không bị trúng.

  1. Là nó đúng để hiểu rằng RestTemplate cung cấp cách thức để gửi dữ liệu theo yêu cầu của cơ thể, nhưng các lỗi xảy ra do máy chủ không thể xử lý yêu cầu của cơ thể?

  2. Nếu nội dung yêu cầu được gửi qua HTTP Nhận không phải là quy ước tại sao RestTemplate cung cấp API để cho phép gửi? Điều này có nghĩa là có rất ít máy chủ có khả năng xử lý phần thân Yêu cầu qua GET?

Tài - thảo luận về việc gửi cơ thể thông qua HTTP GET sử dụng RestTemplate tại diễn đàn mùa xuân

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 es - thảo luận chung về gửi cơ thể thông qua 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

vì không được phép đăng câu trả lời trong các câu hỏi được đánh dấu là trùng lặp, tôi sẽ thực hiện ở đây vì đã dành rất nhiều thời gian để tìm ra cách làm như thế nào Bạn có thể làm cho RestTemplate thực hiện yêu cầu GET với cơ thể bằng cách sử dụng nó trên apache http client với một số điều chỉnh: – LifeIsGoodMF

+0

lớp HttpGetWithBody mở rộng HttpEntityEnclosingRequestBase { HttpGetWithBody (URI cuối cùng uri) { setURI (uri); } @Override chuỗi công khai getMethod() { trả lại HttpGet.METHOD_NAME; }} – LifeIsGoodMF

+0

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory() {@Override bảo vệ HttpUriRequest createHttpUriRequest (HttpMethod httpMethod, URI uri) { if (httpMethod == HttpMethod.GET) { trở HttpGetWithBody mới (uri); } trả lại super.createHttpUriRequest (httpMethod, uri); } }; – LifeIsGoodMF

Trả lời

6

Là nó đúng để hiểu rằng RestTemplate cung cấp đường để gửi dữ liệu dưới dạng yêu cầu cơ thể, nhưng lỗi xảy ra vì máy chủ không thể xử lý cơ thể yêu cầu?

Bạn có thể biết bằng cách xem lưu lượng mạng (yêu cầu được gửi cùng với yêu cầu và phương thức GET?) Và tại nhật ký máy chủ (kết quả 500 bạn nhận phải có hiệu ứng phía máy chủ được ghi lại và nếu không, hãy định cấu hình máy chủ để làm như vậy).

Nếu nội dung yêu cầu được gửi qua HTTP Nhận không phải là lý do tại sao RestTemplate cung cấp API cho phép gửi? Điều này có nghĩa là có rất ít máy chủ có khả năng xử lý phần thân Yêu cầu qua GET?

Vì đây là lớp chung cũng cho phép bạn tạo các yêu cầu có thể bao gồm nội dung thư.

Như đã nêu trong HTTP GET with request body:

Nói cách khác, bất kỳ thông điệp yêu cầu HTTP được phép chứa một nội dung thư, và do đó [một máy chủ] phải phân tích cú pháp tin nhắn với ý nghĩ đó. Tuy nhiên, ngữ nghĩa của máy chủ cho GET bị hạn chế sao cho một cơ thể, nếu có, không có ý nghĩa ngữ nghĩa đối với yêu cầu. Các yêu cầu về phân tích cú pháp tách biệt với các yêu cầu về ngữ nghĩa của phương thức.

Một cơ thể trên một GET không có thể làm bất cứ điều gì về mặt ngữ nghĩa, bởi vì bạn đang yêu cầu một nguồn tài nguyên. Nó giống như bạn nói với máy chủ: "Hãy cho tôi tài nguyên X, oh, và có một số quả táo!". Máy chủ sẽ không quan tâm đến quả táo của bạn và vui vẻ phục vụ tài nguyên X - hoặc ném một lỗi vì nó không giống như bất kỳ phiếu mua hàng nào trong yêu cầu.

Tuy nhiên, tôi đã được yêu cầu thử khả năng để gửi nội dung qua HTTP GET

Xin vui lòng cho một trong những người được yêu cầu này rằng đây là một trường hợp mà không cần phải được kiểm tra, bởi vì không thực hiện hợp lý hỗ trợ nó.

+0

Cảm ơn CodeCaster vì đã trả lời nhanh chóng của bạn! Mặc dù, POST có vẻ là phương thức được triển khai, tôi sẽ định cấu hình máy chủ để kiểm tra nhật ký. –

+0

Thỉnh thoảng thuận tiện hơn khi có tham số truy vấn được triển khai dưới dạng đối tượng json và đặt vào phần thân thay vì url. Trong trường hợp này, máy chủ quan tâm đến những quả táo. – nevster

+0

(Điều đó không ngụ ý nó nhất thiết phải là một ý tưởng hay.) – nevster

Các vấn đề liên quan