最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败、中文乱码等,调了好久才找到下面较为简便的方法:
1 RestTemplate restTemplate = new RestTemplate(); 2 HttpHeaders headers = new HttpHeaders(); 3 MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); 4 headers.setContentType(type); 5 headers.add("Accept", MediaType.APPLICATION_JSON.toString()); 6 7 JSONObject jsonObj = JSONObject.fromObject(params); 8 9 HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers); 10 11 String result = restTemplate.postForObject(url, formEntity, String.class);
如果直接使用在postForObject中把对象传入很容易出现no suitable HttpMessageConverter found for request type的错误,建议直接先转成字符串,见jsonObj.otString(),网上有人说设置RestTemplate的HttpMessageConverter,试了一下要引入各种包。另外要注意中文编码问题,网上有人说StringHttpMessageConverter默认使用ISO-8859-1,要指定为UTF-8编码,自己尝试没有成功,最后通过指定contentType的方式解决了
异步restTemplate:
- public static void main(String[] args) {
- AsyncRestTemplate template = new AsyncRestTemplate();
- //调用完后立即返回(没有阻塞)
- ListenableFuture<ResponseEntity<User>> future = template.getForEntity("http://localhost:9080/spring4/api", User.class);
- //设置异步回调
- future.addCallback(new ListenableFutureCallback<ResponseEntity<User>>() {
- @Override
- public void onSuccess(ResponseEntity<User> result) {
- System.out.println("======client get result : " + result.getBody());
- }
- @Override
- public void onFailure(Throwable t) {
- System.out.println("======client failure : " + t);
- }
- });
- System.out.println("==no wait");
- }
此处使用Future来完成非阻塞,这样的话我们也需要给它一个回调接口来拿结果; Future和Callable是一对,一个消费结果,一个产生结果。调用完模板后会立即返回,不会阻塞;有结果时会调用其回调。
AsyncRestTemplate默认使用SimpleClientHttpRequestFactory,即通过java.net.HttpURLConnection实现;另外我们也可以使用apache的http components;使用template.setAsyncRequestFactory(new HttpComponentsAsyncClientHttpRequestFactory());设置即可。