首先先创建工程: 不会的可以点这里.
工程目录如下:
以下的案例模拟了在需要请求多个请求的参数问题,重点的代码都在cslcp-s的controller中,其他的均为基础配置。注释写的很详细,大家可以去仔细阅读一下。
cslcp-eureka
pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhisen</groupId>
<artifactId>cslcp-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cslcp-eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml:
server:
port: 10001
spring:
application:
name: eureka-server
eureka:
instance:
hostname: 172.16.122.38
client:
hostname: 172.16.122.38
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://127.0.0.1:10001/eureka/
cslcp-1
主类:
package com.zhisen.cslcp1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class Cslcp1Application {
public static void main(String[] args) {
SpringApplication.run(Cslcp1Application.class, args);
}
}
controller:专门负责被调用,正常情况下应该有业务。其中包括了,get无参数;post的param,body,无参;delete的param,body,无参(没有返回值);
package com.zhisen.cslcp1.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class restTemplateController {
@Autowired
RestTemplate restTemplate;
@DeleteMapping("/d1")
public void restTemplatedelete1(){
System.out.println("ok");
}
@DeleteMapping("/d2")
public void restTemplatedelete2(@RequestParam Map<String, Object> result){
System.out.println(result);
}
@DeleteMapping("/d3")
public void restTemplatedelete3(@RequestBody Map<String, Object> result){
System.out.println(result);
}
// 传递参数为Param
@PostMapping("/test3")
public Map<String, Object> restTemplatepostparam(@RequestParam Map<String, Object> result){
return result;
}
// 传递参数为body
@PostMapping("/test2")
public Map<String, Object> restTemplatepost(@RequestBody Map<String, Object> result){
return result;
}
// 传递参数为url或者formdata
@GetMapping("/test1")
public Map<String, Object> restTemplate(@RequestParam Map<String, Object> result){
return result;
}
// 无参数传递
@GetMapping("/test")
public Map<String,Object> test1(){
Map<String,Object> result = new HashMap<String, Object>();
result.put("A01", "post");
return result;
}
}
config:负责注册我们的restTemplate
package com.zhisen.cslcp1.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
pom:除了引入正常的springboot工程,还添加了mysql和fastjson(json传参用)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhisen</groupId>
<artifactId>cslcp-1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cslcp-1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml:
server:
port: 10002
spring:
application:
#服务发现的名称
name: cslcp
#日志
logging:
level:
com.zhisen.cslcp.dao: debug
eureka:
instance:
#自己的ip
hostname: 172.16.122.38
client:
hostname: 172.16.122.38
serviceUrl:
#eureka的地址
defaultZone: http://172.16.122.38:10001/eureka/
cslcp-s
主类:
package com.zhisen.cslcps;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
public class CslcpsApplication {
public static void main(String[] args) {
SpringApplication.run(CslcpsApplication.class, args);
}
}
config:负责注册我们的restTemplate
package com.zhisen.cslcp1.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class AppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
**controller:**负责调用我们的cslcp-1的接口
package com.zhisen.cslcps.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MultivaluedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
@RestController
public class restTemplateController {
@Autowired
RestTemplate restTemplate;
// 简化版本无参数传递方式
@GetMapping("/cslcp01")
public Map<String, Object> restTemplate() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test";
// 开始调用远程接口
Map<String, Object> cs1Map = restTemplate.getForObject(urlString, Map.class);
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
// 正宗版本无参数传递
@GetMapping("/cslcp02")
public Map<String, Object> test1() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test";
// 开始调用远程接口
Map<String, Object> cs1Map = this.restTemplate
.exchange(urlString, HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, Object>>() {
}).getBody();
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
// 简化版本url传递参数
@GetMapping("/cslcp03")
public Map<String, Object> test3() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test1?name={name}&age={age}";
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", "paramMap");
param.put("age", "paramAge");
// 开始调用远程接口
Map<String, Object> cs1Map = restTemplate.getForObject(urlString, Map.class, param);
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
// 正宗版本url传递参数
@GetMapping("/cslcp04")
public Map<String, Object> test4() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test1?name={name}&age={age}";
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", "paramMap");
param.put("age", "paramAge");
// 开始调用远程接口
Map<String, Object> cs1Map = this.restTemplate
.exchange(urlString, HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, Object>>() {
}, param).getBody();
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
// 正宗版本formdata传递参数 不好用不好用
@GetMapping("/cslcp041")
public Map<String, Object> test41() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test1";
// 准备参数
MultiValueMap<String, Object> param = new LinkedMultiValueMap<String, Object>();
param.add("name", "paramMap");
param.add("age", "paramAge");
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(param, headers);
// 开始调用远程接口
Map<String, Object> cs1Map = this.restTemplate
.exchange(urlString, HttpMethod.GET, httpEntity, new ParameterizedTypeReference<Map<String, Object>>() {
}, param).getBody();
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
/*
* 无参数的post传参不演示了,和get大体相同 post使用url传参需要手动拼接postForObject(urlString,
* 请求头,没有可以不写, Map.class, param);
* post使用param传参有三种方法,第一种使用简化版url,第二种使用正规版formdata传参,第三种使用正规版url
*
*
*/
// 简化版本post-body传递参数
@GetMapping("/cslcp05")
public Map<String, Object> test5() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test2";
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", "paramMap");
param.put("age", "paramAge");
// 开始调用远程接口
Map<String, Object> cs1Map = restTemplate.postForObject(urlString, null, Map.class, param);
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
// 正宗版本post-body传递参数
@GetMapping("/cslcp06")
public Map<String, Object> test6() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test2";
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("age", 10);
paramMap.put("name", "cong");
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
paramMap.put("mys", list);
JSONObject jsonObject = new JSONObject(paramMap);
HttpHeaders head = new HttpHeaders();
head.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(jsonObject.toJSONString(), head);
Map<String, Object> a01result = restTemplate
.exchange(urlString, HttpMethod.POST, entity, new ParameterizedTypeReference<Map<String, Object>>() {
}).getBody();
result.put("cslcp-06", a01result);
return result;
}
// 简化版本post-param-formdata传递参数
@GetMapping("/cslcp07")
public Map<String, Object> test7() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/test3";
// 准备参数
MultiValueMap<String, Object> param = new LinkedMultiValueMap<String, Object>();
param.add("name", "paramMap-post");
param.add("age", "paramAge-post");
// 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(param, headers);
// 开始调用远程接口
Map<String, Object> cs1Map = this.restTemplate.exchange(urlString, HttpMethod.POST, httpEntity,
new ParameterizedTypeReference<Map<String, Object>>() {
}, param).getBody();
System.out.println("cslcp01:" + cs1Map);
result.put("s01", "success");
result.put("c01", cs1Map);
return result;
}
/*
* put和delete没有返回值,对于有返回值的业务不适合。
*/
// delete无参数
@GetMapping("/cslcp08")
public Map<String, Object> test8() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/d1";
this.restTemplate.delete(urlString);
result.put("msg", "执行结束");
return result;
}
// requestparam只能支持 url
@GetMapping("/cslcp09")
public Map<String, Object> test9() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 第一种方法
// // 准备访问URL
// String urlString = "http://CSLCP/d2?name={name}&age={age}";
// Map<String, Object> param = new HashMap<String, Object>();
// param.put("name", "paramMap");
// param.put("age", "paramAge");
//
// this.restTemplate.delete(urlString, param);
// 第二种方法
// 准备访问URL
String urlString = "http://CSLCP/d2?name={name}&age={age}";
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", "paramMap");
param.put("age", "paramAge");
this.restTemplate
.exchange(urlString, HttpMethod.DELETE, null, new ParameterizedTypeReference<Map<String, Object>>() {
}, param).getBody();
result.put("msg", "执行结束2");
return result;
}
// requestbody 使用json方式
@GetMapping("/cslcp10")
public Map<String, Object> test10() {
// 创建s工程返回值
Map<String, Object> result = new HashMap<String, Object>();
// 准备访问URL
String urlString = "http://CSLCP/d3";
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("age", 10);
paramMap.put("name", "cong");
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
paramMap.put("mys", list);
JSONObject jsonObject = new JSONObject(paramMap);
HttpHeaders head = new HttpHeaders();
head.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(jsonObject.toJSONString(), head);
Map<String, Object> a01result = restTemplate
.exchange(urlString, HttpMethod.DELETE, entity, new ParameterizedTypeReference<Map<String, Object>>() {
}).getBody();
result.put("msg", "执行结束");
return result;
}
}
yml:
server:
port: 10003
spring:
application:
name: cslcp-s
eureka:
instance:
hostname: 172.16.122.38
client:
hostname: 172.16.122.38
serviceUrl:
defaultZone: http://172.16.122.38:10001/eureka/
pom:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.zhisen</groupId>
<artifactId>cslcp-s</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cslcp-s</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>/
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!