欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RestTemplate发送远程请求

程序员文章站 2022-06-24 22:25:44
...

restTemplatespring提供的可以提供访问rest服务的客户端工具类,提供多种快捷的访问远程的方法,大大提高了客户端的编程效率。解放了原先HttpClient的复杂提交。

借助 RestTemplateSpring应用能够方便地使用REST资源,SpringRestTemplate访问使用了模版方法的设计模式。

模版方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了接口的不同行为。

RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。
其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。
delete() 在特定的URL上对资源执行HTTP DELETE操作

exchange()
在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
映射得到的

execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象

postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得
到的

postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头

optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息

postForLocation() POST 数据到一个URL,返回新创建资源的URL

put() PUT 资源到特定的URL

也就是两种请求,get请求和post请求。

一,get请求

1,getForObject用法

消费者发起请求

/**
     * @title
     * @description get请求  getForObject用法
     * @author FanJiangFeng
     * @updateTime 2019/12/9 15:32
     * @throws
     */
    @RequestMapping("/go")
    @ResponseBody
    public String studyHttp(){
      String url="http://127.0.0.1:8082/demoTest?name={name}&email={email}";
        Map<String,String> map=new HashMap<String, String>();
        map.put("name","樊江锋");
        map.put("email","[email protected]");
        RestTemplate restTemplate=new RestTemplate();
        String response = restTemplate.getForObject(url, String.class, map);
        log.info("response:"+response);
        //[nio-8088-exec-1] com.example.controller.HttpController    : response:success
        return response;
    }

提供者接收并响应请求

 /**
     * @title
     * @description get请求   getForObject用法
     * @author FanJiangFeng
     * @updateTime 2019/12/9 15:32
     * @throws
     */
    @RequestMapping(value = "demoTest", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String demoTest(@RequestParam String name,@RequestParam String email){
        System.out.println(name);
        System.out.println(email);
        return "success";
    }

2,getForEntity用法

消费者发起请求

 /**
     * @title
     * @description get请求  getForEntity用法
     * @author FanJiangFeng
     * @updateTime 2019/12/11 16:19
     * @throws
     */
    @RequestMapping("/getTest")
    @ResponseBody
    public String getTest(){
        String url="http://127.0.0.1:8082/demoTest1?name={name}&email={email}";
//        HttpHeaders headers=new HttpHeaders();
//        headers.set("phone","123456");
        Map<String,Object> map=new HashMap<String, Object>();
        map.put("name","樊江锋");
        map.put("email","[email protected]");
        RestTemplate restTemplate = new RestTemplate();
//        HttpEntity httpEntity = new HttpEntity(headers);
        ResponseEntity<String> response = restTemplate.getForEntity(url,String.class,map);
        log.info("response:"+response.getBody());
        String body = response.getBody();
        return body;
    }

提供者接收并响应请求

/**
     * @title
     * @description get请求  getForEntity用法
     * @author FanJiangFeng
     * @updateTime 2019/12/11 16:19
     * @throws
     */
    @GetMapping(value = "demoTest1", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String demoTest1(@RequestParam String name, @RequestParam String email){
        System.out.println(name);
        System.out.println(email);
        return "success";
    }

二,post请求

当所有传递的数据类型为复杂数据类型headers.setContentType(MediaType.MULTIPART_FORM_DATA并且需要接受的参数不再实体类中进行映射。MultiValueMap来进行传递。

消费者发起请求

 /**
     * @title
     * @description post请求
     * @author FanJiangFeng
     * @updateTime 2019/12/11 16:39
     * @throws
     */
    @RequestMapping("/getTest1")
    @ResponseBody
    public String getTest1(){
        String url="http://127.0.0.1:8082/demoTest2";
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_JSON);
//        headers.set("phone", "123456");

        //传参数可以使用map,也可以使用user
        //如果使用map,下面postForEntity要改成Map类型;postForEntity(url, map,String.class);
//        Map<String,Object> map=new HashMap<String, Object>();
//        map.put("name","樊江锋");
//        map.put("email","[email protected]");
        // 如果使用user对象,要改成user对象  postForEntity(url, user,String.class);
//        User user=new User();
//        user.setName("袁梦阳");
//        user.setEmail("[email protected]");
        //当所有传递的数据类型为复杂数据类型,并且需要接受的参数不再实体类中进行映射。MultiValueMap来进行传递。
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("name", "袁梦阳");
        params.add("email", "[email protected]");
        RestTemplate restTemplate = new RestTemplate();

        //HttpEntity用来装载请求头或者MultiValueMap集合(参数)
//        HttpEntity httpEntity = new HttpEntity(params,headers);
        ResponseEntity<String> request = restTemplate.postForEntity(url,params,String.class);
        System.out.println(request.getBody());
        return request.getBody();
    }

提供者接收并响应请求

 /**
     * @title
     * @description post请求
     * @author FanJiangFeng
     * @updateTime 2019/12/11 16:39
     * @throws
     * //post请求 如果client参数是MultiValueMap传递,需要去掉consumes = MediaType.APPLICATION_JSON_VALUE
     */
    @RequestMapping(value = "demoTest2",produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody   //如果client参数是对象,则括号中为 @RequestBody User user 如果是MultiValueMap,则括号中为 @RequestParam String name,@RequestParam String email
    public String demoTest2(@RequestParam String name,@RequestParam String email){
//        System.out.println(user.getName());
//        System.out.println(user.getEmail());
        System.out.println(name);
        System.out.println(email);
        return "success";
    }

三,综合示例

可以参考下方的RestTemplate的例子发送远程请求。

发送方

 /**
    * @Description  发送远程请求,进入投标保险首页
    * @Date 2019/12/16 15:57
    * @return
    * @Author FanJiangFeng
    * @Version1.0
    * @History
    */
    public String sendPostReq(String requestData) throws IOException {
        RestTemplate restTemplate = new RestTemplate();
        String url = "http://127.0.0.1:7000/tbbx/insurance/enter";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("requestData",requestData);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
        String responseData = response.getBody();
        return responseData;
    }

接收方

/**
     * @title
     * @description 招采平台进入本平台入口
     * @author FanJiangFeng
     * @updateTime 2019/12/10 15:59
     * @throws
     */
    @RequestMapping(value = "/enter",produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String test(@RequestParam String requestData) throws Exception {
        JSONObject jsonObject = JSONObject.parseObject(requestData);
        String APPID=(String) jsonObject.get("APPID");
        String encryptParam=(String) jsonObject.get("encryptParam");
        String signature=(String) jsonObject.get("signature");

       //返回json串数据
        JSONObject map=new JSONObject();
        map.put("status",1000);
        map.put("message","连接成功");
        String jsonString = JSONObject.toJSONString(map);
        return jsonString;
    }

顺利请求并反馈信息流程成功!

相关标签: 跨域访问