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

说明

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

远程服务接口代码示例

TestParam 类代码

在这里插入图片描述

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如下:
在这里插入图片描述
本地服务打印如下,这里的中文参数值已经乱码了:
http://你的服务ip:端口号/consumer/data/test2?startDate=%E5%BC%A0%E4%B8%89&endDate=test111
{“result”:“”,“message”:“操作成功!”,“status”:“200”}

远程示例服务打印如下,这里可以看到中文以乱码的形式传给了远程服务端:
在这里插入图片描述
本地调用接口test3如下:
在这里插入图片描述
远程示例服务打印如下:
在这里插入图片描述

本地调用接口test4如下:
在这里插入图片描述

远程示例服务打印如下:
在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值