●post請求:在RestTemplate中,POST請求可以通過如下三個方法來發起,但post提交方式又有兩種 formData 和 payLoad,而且接口設計與傳統的瀏覽器使用的提交方式又有差異.所以很容易產生混淆。
formData和payLoad的區別:
當POST請求的請求頭里設置Content-Type: application/x-www-form-urlencoded(默認), 參數在請求體以標准的Form Data的形式提交,以&符號拼接,參數格式為key=value&key=value&key=value….
如果使用AJAX原生POST請求,請求頭里設置Content-Type:application/json,請求的參數會顯示在Request Payload中,參數格式為JSON格式:{“key”:”value”,”key”:”value”…},這種方式可讀性會更好。
第一種:postForEntity
@RequestMapping("/hello5")
public String getHello5() throws Exception {
Book book = new Book();
book.setName("水滸傳");
book.setPrice("200");
book.setAuthor("xxx");
book.setPublisher("xxxxxxxxxxxxx");
HttpHeaders headers = new HttpHeaders();
//這里設置的是以payLoad方式提交數據,對於Payload方式,提交的內容一定要是String,且Header要設為“application/json”
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
ObjectMapper mapper = new ObjectMapper();
String value = mapper.writeValueAsString(book);
HttpEntity<String> requestEntity = new HttpEntity<String>(value,
headers);
ResponseEntity<String> res = restTemplate.postForEntity(
"http://10.145.198.143:8081/ords/data_service/monitor/books",
requestEntity, String.class);
return res.getBody();
}
下面是以formData方式請求:
@RequestMapping("hello6")
public String hello6() throws JsonProcessingException{
//ResponseEntity<String> res = restTemplate.getForEntity("http://localhost/test/hello2", String.class);
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
User u = new User();
u.setName("rdb");
u.setPasswd("abc123");
ObjectMapper om = new ObjectMapper();
String value = om.writeValueAsString(u);
System.out.println(u.toString());
System.out.println(value);
HttpEntity<String> entity = new HttpEntity<String>(value,header);
ResponseEntity<String> res = restTemplate.postForEntity("http://localhost/test/hello2", entity, String.class);
return res.getBody();
}
服務端接收參數總結說明:
@RequestParam :
A) 常用來處理簡單類型的綁定,通過Request.getParameter() 獲取的String可直接轉換為簡單類型的情況( 由String到 簡單類型的轉換操作由ConversionService配置的轉換器來完成);因為使用request.getParameter()方式獲取參數,所以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。
B)用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST。(不設置這個屬性,好像這就是默認值)
C) 該注解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示參數是否必須綁定。
在方法參數里面如是:public @ResponseBody JsonResult getPublishedToposByConnStreamId(@RequestParam(value = "streamId", required = false) String streamId) {}
@RequestBody
A) GET、POST方式提時, 根據request header Content-Type的值來判斷:
application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
multipart/form-data, 不能處理(次類型多用來上傳文件類型---即使用@RequestBody不能處理這種格式的數據,@RequestParam這個卻是可以處理的。);
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);
B) PUT方式提交時, 根據request header Content-Type的值來判斷:(表示沒見過put方式滴,可以無視吧。)
application/x-www-form-urlencoded, 必須;
multipart/form-data, 不能處理;
其他格式, 必須;
結論:@RequestBody這個一般處理的是在ajax請求中聲明contentType: "application/json; charset=utf-8"時候。也就是json數據或者xml(我沒用過這個,用的是json)
@RequestParam這個一般就是在ajax里面沒有聲明contentType的時候,為默認的APPLICATION_FORM_URLENCODED格式時,用這個。
第二種:postForObject
如果你只關注,返回的消息體,可以直接使用postForObject。用法和getForObject一致。
第三種:postForLocation
postForLocation也是提交新資源,提交成功之后,返回新資源的URI,postForLocation的參數和前面兩種的參數基本一致,只不過該方法的返回值為Uri,這個只需要服務提供者返回一個Uri即可,該Uri表示新資源的位置。