RestTemplate使用笔记

Springboot提供的RestTemplate可以进行微服务之间的接口调用,在实际的开发中用到的比较多,这里做一个简单的总结
一、使用postForObject()方法传参
1、当服务消费者传参为实体类对象时,

    //服务消费者方法
    @ResponseBody
    @RequestMapping("/entity")
    public Object testRestTemplate() {
        Student student = new Student();
        student.setId("001");
        student.setName("jack");
        student.setAge(20);
        
        String url = "http://127.0.0.1:8091/orderService/service/entity";
        //使用postForObject(String url,Object request,Class<T> responseType)
        String result = restTemplate.postForObject(url,student,String.class);
        System.out.println("返回数据:" + result);
        return result;
    }




//服务提供者方法(接口)
/**
     * 当RestTemplate传递实体类Entity为参数时,
     * 使用@RequestBody()Entity entity进行接收;
     * 也可以使用@RequestBody() Map<String,Object> map 进行接收
     * 使用@RequestBody()JSONObject jsonObj进行接收
     *
     * HttpServletRequest接收为null
     * 使用 String id,String name.....接收也为null
     * @param student
     * @return
     */
    @ResponseBody
    @RequestMapping("/entity")
    public String testRestTemplate(@RequestBody(required = false) Student student) {

        System.out.println("对象 接收请求参数:"+student);

        student.setName("tom");

        return "实体类对象"+student;

    }

2、当服务消费者传参为JSON对象时

//服务消费者方法
    @ResponseBody
    @RequestMapping("/jsonEntity")
    public String testRestTemplate02() {

        JSONObject jsonObj = new JSONObject();
        jsonObj.put("id", "001");
        jsonObj.put("name", "jack");
        jsonObj.put("age", 20);

        String url = "http://127.0.0.1:8091/orderService/service/jsonEntity";
        String result = restTemplate.postForObject(url, jsonObj, String.class);

        System.out.println("返回数据:" + result);
        return result;
    }




//服务提供者方法(接口)
/**
     *  当RestTemplate传递JSON对象为参数,
     *  使用@RequestBody() Entity entity可以进行接收
     *  使用@RequestBody() Map<String,Object> map可以进行接收
     *  使用@RequestBody()JSONObject jsonObj进行接收
     *
     *  使用HttpServletRequest接收值为null,
     *  使用String id,String name......接收值为Null
     *
     * @param request
     * @return
     */
    @ResponseBody
    @RequestMapping("/jsonEntity")
    public String testRestTemplate02(@RequestBody(required = false)Student student) {

        
        System.out.println("json对象 接收请求参数:" + student)

        return "json对象"+student;

    }

3、当服务消费者传参为JSON字符串时

 


//服务消费者方法
    @ResponseBody
    @RequestMapping("/jsonEntityStr")
    public String testRestTemplate03() {

        JSONObject jsonObj = new JSONObject();
        jsonObj.put("id", "001");
        jsonObj.put("name", "jack");
        jsonObj.put("age", 20);

        //设置协议头
        /*
         * org.springframework.http.HttpEntity;
         * org.springframework.http.HttpHeaders;
         * org.springframework.http.MediaType;
         */
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        //将要发送的数据和协议头放到请求体对象中,作为参数传递
        HttpEntity<String> httpEntity = new HttpEntity<String>(jsonObj.toString(), headers);

        String url = "http://127.0.0.1:8091/orderService/service/jsonEntityStr";
        String result = restTemplate.postForObject(url, jsonObj.toString(), String.class);

        System.out.println("返回请求参数:" + result);
        return result;

    }
    


//服务提供者方法(接口)
/**
     * 当RestTemplate传递JSON字符串为参数,
     * 需要先进行发送协议头设置
     * 1、可使用@RequestBody() Entity entity 接收
     * 2、使用@RequestBody() JSONObject jsonObj 接收
     * 3、使用@RequestBody() Map<> map 接收
     *
     * 若使用HttpServletRequest接收,则接收值为Null
     *使用String id,String name.....接收值为Null
     *
     * @param student
     * @return
     */

    @ResponseBody
    @RequestMapping("/jsonEntityStr")
    public String testRestTemplate03(@RequestBody(required = false)Map<String,Object> map) {

        String name = map.get("name").toString();

        System.out.println("json对象字符串 接收请求参数:"+ name );

        //Student student = new Student();

        return "json对象字符串"+name;

    }

二、使用postForEntity()方法
postForEntity()方法和postForObject()方法的使用差不多,不同的地方在于返回值不一样,postForObject()返回的是我们设置的 Class responseType 的T类型对象
postForEntity()返回的是整个响应体对象

//服务消费者
@ResponseBody
    @RequestMapping("/postForEntity")
    public String getRestTemplate() {
        Student student = new Student();
        student.setId("001");
        student.setName("jack");
        student.setAge(20);
        String url = "http://127.0.0.1:8091/orderService/service/entity";
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, student, String.class);
        restTemplate.post
        System.out.println("返回信息:"+responseEntity);
        //返回信息:<200,实体类对象Student(id=001, name=tom, age=20),
        // [Content-Type:"text/plain;
        // charset=UTF-8", Content-Length:"48", Date:"Sun, 23 May 2021 07:00:57 GMT", Keep-Alive:"timeout=60", Connection:"keep-alive"]>
        return null;
    }

//服务提供者
  @ResponseBody
    @RequestMapping("/entity")
    public String testRestTemplate(@RequestBody(required = false) Student student) {

        System.out.println("对象 接收请求参数:"+student);

        student.setName("tom");

        return "实体类对象"+student;

    }

输出内容如下:
RestTemplate使用笔记
三、getForObject()方法使用

//服务消费者方法
 @ResponseBody
    @RequestMapping("/getForObject")
    public String getEntity() {
        String url = "http://127.0.0.1:8091/orderService/service/getForObject?id=001&&name=tom&&age=34";

        String result = restTemplate.getForObject(url,String.class);
        System.out.println(result);
        return result;
    }



//服务提供者方法(接口)
 /**    当传参方式为get方式时
     *    使用HttpServletRequest request
     *    使用String id,String name.....
     *    使用@RequestBody() Map<> map
     * @param name
     * @return
     */
   @ResponseBody
   @RequestMapping("/getForObject")
   public String testGetMethod(String id,String name){

        return name;

   }

上一篇:详解Java 去除json 数据中的null


下一篇:世界人工智能大会见闻