如何在Spring RestTemplate请求上设置“Accept:”标题?
我想设置Accept:
的值Accept:
在我使用Spring的RestTemplate
的RestTemplate
。
这是我的Spring请求处理代码
@RequestMapping( value= "/uom_matrix_save_or_edit", method = RequestMethod.POST, produces="application/json" ) public @ResponseBody ModelMap uomMatrixSaveOrEdit( ModelMap model, @RequestParam("parentId") String parentId ){ model.addAttribute("attributeValues",parentId); return model; }
这里是我的Java REST客户端:
public void post(){ MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); params.add("parentId", "parentId"); String result = rest.postForObject( url, params, String.class) ; System.out.println(result); }
这适用于我; 我从服务器端得到一个JSONstring。
我的问题是:当我使用RestTemplate时,如何指定Accept:
头(例如application/json
, application/xml
,…)和请求方法(例如GET
, POST
,…)?
我build议使用接受HttpEntity
的exchange
方法之一,也可以设置HttpHeaders
。 (您也可以指定要使用的HTTP方法。)
例如,
RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
我更喜欢这个解决scheme,因为它是强types的,即。 exchange
期望一个HttpEntity
。
但是,您也可以将该HttpEntity
作为request
parameter passing给postForObject
。
HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); restTemplate.postForObject(url, entity, String.class);
这在RestTemplate#postForObject
Javadoc中提到。
request
参数可以是HttpEntity
,以便为请求添加额外的HTTP头 。
您可以在RestTemplate中设置一个拦截器“ClientHttpRequestInterceptor”,以避免每次发送请求时设置标题。
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { private final String headerName; private final String headerValue; public HeaderRequestInterceptor(String headerName, String headerValue) { this.headerName = headerName; this.headerValue = headerValue; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { request.getHeaders().set(headerName, headerValue); return execution.execute(request, body); } }
然后
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); interceptors.add(new HeaderRequestInterceptor("Accept", MediaType.APPLICATION_JSON_VALUE)); RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(interceptors);
如果像我一样努力寻找一个使用基本身份validation和其他模板交换API的示例,这就是我最终devise出来的…
private HttpHeaders createHttpHeaders(String user, String password) { String notEncoded = user + ":" + password; String encodedAuth = Base64.getEncoder().encodeToString(notEncoded.getBytes()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.add("Authorization", "Basic " + encodedAuth); return headers; } private void doYourThing() { String theUrl = "http://blah.blah.com:8080/rest/api/blah"; RestTemplate restTemplate = new RestTemplate(); try { HttpHeaders headers = createHttpHeaders("fred","1234"); HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); ResponseEntity<String> response = restTemplate.exchange(theUrl, HttpMethod.GET, entity, String.class); System.out.println("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody()); } catch (Exception eek) { System.out.println("** Exception: "+ eek.getMessage()); } }
- REST API – 为什么使用PUT DELETE POST GET?
- WCF数据服务(OData)与ASP.NET Web API
- 禁用JSON中的超文本应用程序语言(HAL)?
- 在ASP.net MVC 4 WebApi中嵌套的资源
- 如何为HttpClient请求设置Content-Type头?
- API分页最佳实践
- Postman Chrome应用程序中的form-data,x-www-form-urlencoded和raw之间的区别是什么?
- 使用AngularJS进行身份validation,使用REST API WS进行会话pipe理和安全问题
- Spring Boot Rest Controller如何返回不同的HTTP状态码?