SpringBoot使用RestTemplate远程调用其他服务接口补充示例

SpringBoot使用RestTemplate远程调用其他服务接口补充示例

  • 说明
  • 远程服务接口代码示例
    • TestParam 类代码
    • Controller层远程服务示例代码
  • RestTemplate调用服务代码
    • RestTestController代码
  • 测试结果如下:

说明

今天有个项目要远程调用其他项目的接口,发现它项目接口是url参数以及body传参一起使用,这里延伸补充我的这篇远程调用示例SpringBoot使用RestTemplate远程调用其他服务接口。怕以后忘记怎么使用,先做个笔记。

远程服务接口代码示例

TestParam 类代码

SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第1张图片

Controller层远程服务示例代码

	//远程需要调用这个url参数拼接加body一起传参接口,这里模拟这个示例
	@PostMapping(value = {"/test2"})
    public Object test2(@RequestParam(value = "startDate", required = false) String startDate,
                        @RequestParam(value = "endDate", required = false) String endDate,
                        @RequestBody TestParam testParam) {
        Map<String, Object> returnMap = new HashMap<>();
        try {
            System.out.println(startDate);
            System.out.println(endDate);
            System.out.println(testParam.getCity());
            System.out.println(testParam.getIndustry());
            System.out.println(testParam.getPartner());
            System.out.println(testParam.getProjectName());
            System.out.println(testParam.getSignLevel());
            returnMap.put("message", "操作成功!");
            returnMap.put("result", "");
            returnMap.put("status", "200");
        }catch (Exception e){
            e.printStackTrace();
            returnMap.put("message",e.getMessage());
            returnMap.put("status","500");
            returnMap.put("result","");
        }
        return returnMap;
    }
	
	//以get方式占位符(路径)形式传参加url拼接参数传参,这里模拟这个示例
    @GetMapping(value = {"/test3/{id}"})
    public Object test3(@RequestParam(value = "startDate", required = false) String startDate,
                        @RequestParam(value = "endDate", required = false) String endDate,
                        @PathVariable String id) {
        Map<String, Object> returnMap = new HashMap<>();
        try {
            System.out.println(id);
            System.out.println(startDate);
            System.out.println(endDate);
            returnMap.put("message", "操作成功!");
            returnMap.put("result", "");
            returnMap.put("status", "200");
        }catch (Exception e){
            e.printStackTrace();
            returnMap.put("message",e.getMessage());
            returnMap.put("status","500");
            returnMap.put("result","");
        }
        return returnMap;
    }
	
	//以post方式占位符(路径)形式传参加url拼接参数传参,这里模拟这个示例
    @PostMapping(value = {"/test4/{id}"})
    public Object test4(@RequestParam(value = "startDate", required = false) String startDate,
                        @RequestParam(value = "endDate", required = false) String endDate,
                        @PathVariable String id) {
        Map<String, Object> returnMap = new HashMap<>();
        try {
            System.out.println(id);
            System.out.println(startDate);
            System.out.println(endDate);
            returnMap.put("message", "操作成功!");
            returnMap.put("result", "");
            returnMap.put("status", "200");
        }catch (Exception e){
            e.printStackTrace();
            returnMap.put("message",e.getMessage());
            returnMap.put("status","500");
            returnMap.put("result","");
        }
        return returnMap;
    }

RestTemplate调用服务代码

这里是在我原来那篇文章做补充示例,所以这里直接写远程调用示例代码了,就不写怎么集成RestTemplate了。

RestTestController代码

package com.project.restdemo.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.project.restdemo.dto.UserParam;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping(value = "/rest")
public class RestTestController {

    @Resource
    private RestTemplate restTemplate;

    /**
     *测试2,同时将参数以url拼接形式以及body形式传参
     *如:http://你的远程服务ip:端口号/consumer/test2?startDate=xxx&endDate=xxx
     */
    @PostMapping(value = "/test2")
    public Object test2(@RequestBody TestParam testParam){
        // 请求地址
        String url = "http://你的远程服务ip:端口号/consumer/test2";

        //提交参数设置
        MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
        multiValueMap.add("startDate", "张三");//中文会乱码
        multiValueMap.add("endDate", "test111");
        //将参数拼入请求url中,如果参数值为中文会乱码,这里中文乱码问题需要进一步处理,这里暂时没有处理
        UriComponentsBuilder builder=UriComponentsBuilder.fromHttpUrl(url).queryParams(multiValueMap);
        System.out.println(builder.toUriString());

        //请求头设置,指定数据以application/json格式的数据格式的数据传递参数
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
        headers.add("Accept",MediaType.APPLICATION_JSON.toString());
        headers.add("Accept-Charset","UTF-8");
        //组装请求体
        HttpEntity<TestParam> request = new HttpEntity<>(testParam, headers);

        //发送post请求,并打印结果,以JSON类型接收响应结果JSON结构数据
        //第1个参数:请求的url地址
        //第2个参数:请求的字段参数加数据格式
        //第3个参数:返回的结果类型,这里JSONObject.class表示返回结果是一个Json结构的数据。
        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(builder.toUriString(), request,JSONObject.class);
        System.out.println(responseEntity.getBody());
        return responseEntity.getBody();
    }

    /**
     *测试3,参数以占位符形式传参,以get请求调用服务接口
     */
    @PostMapping(value = "/test3")
    public Object test3(@RequestParam(value = "id", required = false) String id){
        // 请求地址
        String url = "http://你的远程服务ip:端口号/consumer/test3/{id}?startDate={startDate}&endDate={endDate}";

        System.out.println("id="+id);

        //提交参数设置,这里map里面的key要与请求地址里面占位符名一样,{username}对应map的key:username
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("startDate", "张三");//不会乱码
        map.put("endDate", "test111");

        //发送get请求,并打印结果,以JSON类型接收响应结果JSON结构数据
        //第1个参数:请求的url地址
        //第2个参数:JSONObject.class表示返回结果是一个Json结构的数据
        //第3个参数:请求的占位符值
        ResponseEntity<JSONObject> responseEntity = restTemplate.getForEntity(url, JSONObject.class,map);
        System.out.println(responseEntity.getBody());
        return responseEntity.getBody();
    }

    /**
     *测试3,同时将参数以url拼接形式以及路径形式传参,以post请求调用服务接口
     */
    @PostMapping(value = "/test4")
    public Object test4(@RequestParam(value = "id", required = false) String id){
        // 请求地址
        String url = "http://你的远程服务ip:端口号/consumer/test4/"+id;
        System.out.println("url="+url);
        System.out.println("id="+id);

        //提交参数设置
        MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
        multiValueMap.add("startDate", "张三");//不会乱码
        multiValueMap.add("endDate", "test111");

        //发送post请求,并打印结果,以JSON类型接收响应结果JSON结构数据
        //第1个参数:请求的url地址
        //第2个参数:参数值
        //第3个参数:JSONObject.class表示返回结果是一个Json结构的数据
        ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(url, multiValueMap,JSONObject.class);
        System.out.println(responseEntity.getBody());
        return responseEntity.getBody();
    }

}

测试结果如下:

本地调用接口test2如下:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第2张图片
本地服务打印如下,这里的中文参数值已经乱码了:
http://你的服务ip:端口号/consumer/data/test2?startDate=%E5%BC%A0%E4%B8%89&endDate=test111
{“result”:“”,“message”:“操作成功!”,“status”:“200”}

远程示例服务打印如下,这里可以看到中文以乱码的形式传给了远程服务端:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第3张图片
本地调用接口test3如下:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第4张图片
远程示例服务打印如下:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第5张图片

本地调用接口test4如下:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第6张图片

远程示例服务打印如下:
SpringBoot使用RestTemplate远程调用其他服务接口补充示例_第7张图片

好了,补充示例先到这里。如果还有什么额外没有用过的请求形式,这里会继续补充。

你可能感兴趣的:(SpringBoot篇,spring,boot,java,spring,后端)