zoukankan      html  css  js  c++  java
  • 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(); }
  • 相关阅读:
    Java之JDBC操作
    Ubuntu17安装MySql5.7
    应用解决告诉你什么时候该用ajax
    jquery插件大全
    面试题:谈谈如何优化MYSQL数据库查询
    1亿条数据在PHP中实现Mysql数据库分表100张
    DEDECMS教程:首页实现分页的两种方法
    Dedecms当前位置{dede:field name='position'/}修改,去掉>方法
    mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?
    COOKIE和SESSION关系和区别等
  • 原文地址:https://www.cnblogs.com/tomcatandjerry/p/5899722.html
Copyright © 2011-2022 走看看