如何在SpringRestTemplate请求中设置“Accept:”标题?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我想Accept:在我使用Spring的请求中设置值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);
}

这适用于我; 我从服务器端得到一个JSON字符串。

我的问题是:当我使用RestTemplate时,如何指定Accept:标题(例如application/jsonapplication/xml...)和请求方法(例如,...)?GETPOST

提问于
用户回答回答于

例如,

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);

我更喜欢这个解决方案,因为它是强类型的。exchange期望HttpEntity...

但是,你也可以传递HttpEntity作为request争论postForObject...

HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
restTemplate.postForObject(url, entity, String.class); 

这在RestTemplate#postForObjectJavadoc...

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);

扫码关注云+社区