今天有个项目要远程调用其他项目的接口,发现它项目接口是url参数以及body传参一起使用,这里延伸补充我的这篇远程调用示例SpringBoot使用RestTemplate远程调用其他服务接口。怕以后忘记怎么使用,先做个笔记。
//远程需要调用这个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了。
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如下:
远程示例服务打印如下:
好了,补充示例先到这里。如果还有什么额外没有用过的请求形式,这里会继续补充。