Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
{
"Author": "tomcat and jerry",
"url":"http://www.cnblogs.com/tomcatandjerry/p/5899722.html"
}
Spring RestTemplate, 使用java访问URL更加优雅,更加方便。
核心代码:
String url = "http://localhost:8080/json"; JSONObject json = restTemplate.getForEntity(url, JSONObject.class).getBody();
就这么简单,API访问完成了!
附上SpringBoot相关的完整代码:
RestTemplateConfig.java @Configuration public class RestTemplateConfig{ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000);//ms factory.setConnectTimeout(15000);//ms return factory; } }
SpringRestTemplateApp.java @RestController @EnableAutoConfiguration @Import(value = {Conf.class}) public class SpringRestTemplateApp { @Autowired RestTemplate restTemplate; /***********HTTP GET method*************/ @RequestMapping("") public String hello(){ String url = "http://localhost:8080/json"; JSONObject json = restTemplate.getForEntity(url, JSONObject.class).getBody(); return json.toJSONString(); } @RequestMapping("/json") public Object genJson(){ JSONObject json = new JSONObject(); json.put("descp", "this is spring rest template sample"); return json; } /**********HTTP POST method**************/ @RequestMapping("/postApi") public Object iAmPostApi(@RequestBody JSONObject parm){ System.out.println(parm.toJSONString()); parm.put("result", "hello post"); return parm; } @RequestMapping("/post") public Object testPost(){ String url = "http://localhost:8080/postApi"; JSONObject postData = new JSONObject(); postData.put("descp", "request for post"); JSONObject json = restTemplate.postForEntity(url, postData, JSONObject.class).getBody(); return json.toJSONString(); } public static void main(String[] args) throws Exception { SpringApplication.run(SpringRestTemplateApp.class, args); } }
===============================
另外还支持异步调用AsyncRestTemplate
@RequestMapping("/async") public String asyncReq(){ String url = "http://localhost:8080/jsonAsync"; ListenableFuture<ResponseEntity<JSONObject>> future = asyncRestTemplate.getForEntity(url, JSONObject.class); future.addCallback(new SuccessCallback<ResponseEntity<JSONObject>>() { public void onSuccess(ResponseEntity<JSONObject> result) { System.out.println(result.getBody().toJSONString()); } }, new FailureCallback() { public void onFailure(Throwable ex) { System.out.println("onFailure:"+ex); } }); return "this is async sample"; }
================================
贴一段post请求如何自定义header
@RequestMapping("/headerApi")//模拟远程的restful API public JSONObject withHeader(@RequestBody JSONObject parm, HttpServletRequest req){ System.out.println("headerApi====="+parm.toJSONString()); Enumeration<String> headers = req.getHeaderNames(); JSONObject result = new JSONObject(); while(headers.hasMoreElements()){ String name = headers.nextElement(); System.out.println("["+name+"]="+req.getHeader(name)); result.put(name, req.getHeader(name)); } result.put("descp", "this is from header"); return result; }
@RequestMapping("/header") public Object postWithHeader(){
//该方法通过restTemplate请求远程restfulAPI HttpHeaders headers = new HttpHeaders(); headers.set("auth_token", "asdfgh"); headers.set("Other-Header", "othervalue"); headers.setContentType(MediaType.APPLICATION_JSON); JSONObject parm = new JSONObject(); parm.put("parm", "1234"); HttpEntity<JSONObject> entity = new HttpEntity<JSONObject>(parm, headers); HttpEntity<String> response = restTemplate.exchange( "http://localhost:8080/headerApi", HttpMethod.POST, entity, String.class);//这里放JSONObject, String 都可以。因为JSONObject返回的时候其实也就是string return response.getBody(); }
posted on 2016-09-23 13:37 tomcat and jerry 阅读(56960) 评论(1) 编辑 收藏 举报