項目結構附圖如下:
Springboot RestTemplate post/get請求所有情況 1. 準備服務提供者
1.1 建立service-provider的項目
1.1.1 pom.xml如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.16.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
1.1.2 application.yml如下
server:
port: 8080
spring:
application:
name: post-get-provider
1.1.4 入口類App.java
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
1.1.5 接口類TestController.java,主要是為了給restTemplate提供通路的位址準備的。
@RestController
public class TestController {
/**
* 1.無參數get請求
*/
@GetMapping("/get")
public String get() {
return "無參數 get";
}
/**
* 2.有參數get請求 問号傳參
*/
@GetMapping("/get1")
public String get1(@RequestParam("name") String name) {
return "有參 get :" + name;
}
/**
* 3.有參get請求 restful風格
*/
@GetMapping("/get2/{name}")
public List<User> get2(@PathVariable("name") String name) {
List<User> list = new ArrayList<>();
for (int i = 0; i < 4; i++) {
User user = new User();
user.setId(i);
user.setName("tom--" + i);
user.setHobby("cup-" + i);
list.add(user);
}
return list;
}
/**
* 4.get需要設定header
*/
@GetMapping("/get3")
public String get3(@RequestParam("name") String name, @RequestHeader("token") String token) {
return "設定header的get: name: " + name + ",token:" + token;
}
/**
* 4.1 .get需要設定header 傳回值是List
*/
@GetMapping("/get4")
public List<User> get4(@RequestParam("name") String name, @RequestHeader("token") String token) {
List<User> list = new ArrayList<>();
for (int i = 0; i < 4; i++) {
User user = new User();
user.setId(i);
user.setName("tom--" + i);
user.setHobby("cup-" + i);
list.add(user);
}
return list;
}
/**
* 4.2 .get需要設定header 傳回值是對象
*/
@GetMapping("/get5")
public User get5(@RequestParam("name") String name, @RequestHeader("token") String token) {
User user = new User();
user.setId(1111);
user.setName("tom");
user.setHobby("baskeball");
return user;
}
/**
* 4.3 .get需要設定header 傳回值是對象 帶有泛型
*/
@GetMapping("/get6")
public Student<User> get6(@RequestParam("name") String name, @RequestHeader("token") String token) {
User user = new User();
user.setId(1111);
user.setName("tom");
user.setHobby("baskeball");
Student<User> su = new Student<>();
su.setId(user.getId() + "");
su.setName(user.getName());
su.setT(user);
System.out.println(su.toString());
return su;
}
/**
* 5.post請求
*/
@PostMapping("/post")
public User post1(@RequestBody User user) {
user.setId(1111);
user.setName("tom");
user.setHobby("baskeball");
return user;
}
/**
* 6.post請求 帶有header
*/
@PostMapping("/post2")
public User post2(@RequestBody User user, @RequestHeader("token") String token) {
user.setId(1111);
user.setName(user.getName() + ":" + token);
user.setHobby(user.getHobby() + ":" + token);
return user;
}
/**
* 7.post請求 帶有header 帶有問号傳參
*/
@PostMapping("/post3")
public User post3(@RequestParam("name")String name,
@RequestBody User user,
@RequestHeader String token){
user.setName(name);
user.setId(11111);
user.setHobby(token);
return user;
}
/**
* 8.post請求 帶有header 帶有restful風格傳參
*/
@PostMapping("/post4/{name}")
public User post4(@PathVariable("name")String name,
@RequestBody User user,
@RequestHeader("token") String token){
user.setName(name);
user.setId(11111);
user.setHobby(token);
return user;
}
/**
* 9.post請求 form表單送出參數
*/
@PostMapping("/post5")
public User post5(User user){
user.setHobby("post5");
user.setId(999);
user.setName("9090");
return user;
}
/**
* 9.post請求 form表單送出對象參數,帶有header,帶有問号傳參
*/
@PostMapping("/post6")
public User post6(User user,@RequestParam("name")String name,@RequestHeader("token")String token){
user.setHobby("post5");
user.setId(999);
user.setName("9090");
return user;
}
}
1.1.6 實體類User.java,省略get/set方法
public class User {
private int id;
private String name;
private String hobby;
}
1.1.7 實體類Student.java,省略get/set方法
public class Student<T> {
private String id;
private String name;
private T t;
}
1.1.8 運作App.java,提供接口服務。
2.服務消費者
2.1 建立service-consumer的項目
2.1.1 pom.xml如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.16.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
</dependencies>
2.1.2 application.yml
server:
port: 8081
spring:
application:
name: post-get-consumer
2.1.3 App.java啟動類
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
2.1.4 RestTemplateConfig.java配置類
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.1.5 實體類Student.java
public class Student<T> {
private String id;
private String name;
private T t;
}
2.1.6 實體類User.java
public class User {
private int id;
private String name;
private String hobby;
}
2.1.7 測試類AppTest.java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class AppTest {
@Autowired
private RestTemplate restTemplate;
/**
* 1.無參數 get請求
*/
@Test
public void test1() {
String result = restTemplate.getForObject("http://localhost:8080/get", String.class);
System.out.println(result);
}
/**
* 2.有參數 get請求 問号傳參
*/
@Test
public void test2() {
String result = restTemplate.getForObject("http://localhost:8080/get1?name=zs", String.class);
System.out.println(result);
}
/**
* 3.有參數 get請求 restful風格參數 傳回值是List
*/
@Test
public void test3() {
List result = restTemplate.getForObject("http://localhost:8080/get2/lisi", List.class);
System.out.println(result);
}
/**
* 4.有參數 get請求 需要設定header值 傳回值是基礎類型String
*/
@Test
public void test4() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", "123456");
HttpEntity httpEntity = new HttpEntity(map);
//設定header和傳回值類型
RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, String.class);
//設定響應值解析
ResponseExtractor<ResponseEntity<String>> responseExtractor = restTemplate.responseEntityExtractor(String.class);
ResponseEntity<String> response = restTemplate.execute("http://localhost:8080/get3?name=ww", HttpMethod.GET, requestCallback, responseExtractor);
System.out.println(response.getBody());
}
/**
* 5.有參數 get請求 需要設定header值 傳回值是List類型
*/
@Test
public void test5() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", "123456");
HttpEntity httpEntity = new HttpEntity(map);
//設定header和傳回值類型
RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, List.class);
//設定響應值解析
ResponseExtractor<ResponseEntity<List>> responseExtractor = restTemplate.responseEntityExtractor(List.class);
ResponseEntity<List> response = restTemplate.execute("http://localhost:8080/get4?name=ww", HttpMethod.GET, requestCallback, responseExtractor);
System.out.println(response.getBody());
}
/**
* 6.有參數 get請求 需要設定header值 傳回值是對象類型
*/
@Test
public void test6() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", "123456");
HttpEntity httpEntity = new HttpEntity(map);
//設定header和傳回值類型
RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, User.class);
//設定響應值解析
ResponseExtractor<ResponseEntity<User>> responseExtractor = restTemplate.responseEntityExtractor(User.class);
ResponseEntity<User> response = restTemplate.execute("http://localhost:8080/get5?name=ww", HttpMethod.GET, requestCallback, responseExtractor);
System.out.println(response.getBody().toString());
}
/**
* 7.有參數 get請求 需要設定header值 傳回值是對象類型 帶有泛型
*/
@Test
public void test7() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", "123456");
HttpEntity httpEntity = new HttpEntity(map);
//設定header和傳回值類型
RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, Student.class);
//設定響應值解析
ResponseExtractor<ResponseEntity<Student>> responseExtractor = restTemplate.responseEntityExtractor(Student.class);
ResponseEntity<Student> response = restTemplate.execute("http://localhost:8080/get6?name=ww", HttpMethod.GET, requestCallback, responseExtractor);
System.out.println(response.getBody().toString());
}
/**
* 7.有參數 get請求 需要設定header值 傳回值是對象 使用Object 接收
*/
@Test
public void test8() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("token", "123456");
HttpEntity httpEntity = new HttpEntity(map);
//設定header和傳回值類型
RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, Object.class);
//設定響應值解析
ResponseExtractor<ResponseEntity<Object>> responseExtractor = restTemplate.responseEntityExtractor(Object.class);
ResponseEntity<Object> response = restTemplate.execute("http://localhost:8080/get6?name=ww", HttpMethod.GET, requestCallback, responseExtractor);
System.out.println(response.toString());
//使用JSON new TypeReference帶上泛型,解析Object
Student<User> result = JSON.parseObject(JSON.toJSONString(response.getBody()), new TypeReference<Student<User>>() {
});
System.out.println(result.toString());
}
//-----------------------------post------------------------------------------------------------
/**
* post 請求 對象參數 postForEntity
*/
@Test
public void test9() {
String url = "http://localhost:8080/post";
JSONObject param = new JSONObject();
param.put("id", 1);
param.put("name", "adff");
param.put("hobby", "afdfasdfds");
/**
* postForEntity::
* url: 請求的位址
* param: 請求的參數-必須是JSONObject
* User.class: 傳回值的泛型class
*/
ResponseEntity<User> rs = restTemplate.postForEntity(url, param, User.class);
System.out.println(JSON.toJSONString(rs.getBody()));
}
/**
* post 請求 對象參數 方式二 postForObject
*/
@Test
public void test10() {
String url = "http://localhost:8080/post";
User user = new User();
user.setId(222);
user.setName("fdafdsf");
user.setHobby("Fdsafds");
/**
* postForObject:
* url: 請求的位址
* user: 請求的參數-必須是實體對象
* User.class: 傳回值的泛型class
*/
User rs = restTemplate.postForObject(url, user, User.class);
System.out.println(JSON.toJSONString(rs.toString()));
}
/**
* post 請求 對象參數 帶有header
*/
@Test
public void test11() {
String url = "http://localhost:8080/post2";
//建立Header對象,設定header資訊和請求方式
HttpHeaders headers = new HttpHeaders();
headers.add("token","xxx");
headers.setContentType(MediaType.APPLICATION_JSON);
User user1 = new User();
user1.setId(1111);
user1.setName("fdasf");
user1.setHobby("fdsaf");
//将header資訊和請求參數封裝在HttpEntity中
HttpEntity<User> userHttpEntity = new HttpEntity<>(user1, headers);
User user = restTemplate.postForObject(url, userHttpEntity, User.class);
System.out.println(user.toString());
}
/**
* post 請求 對象參數 帶有header 帶有問号傳參
*/
@Test
public void test12(){
String url = "http://localhost:8080/post3?name=nihao";
//建立Header對象,設定header資訊和請求方式
HttpHeaders headers = new HttpHeaders();
headers.add("token","xxx");
headers.setContentType(MediaType.APPLICATION_JSON);
User user1 = new User();
user1.setId(1111);
user1.setName("fdasf");
user1.setHobby("fdsaf");
//将header資訊和請求參數封裝在HttpEntity中
HttpEntity<User> userHttpEntity = new HttpEntity<>(user1, headers);
User user = restTemplate.postForObject(url, userHttpEntity, User.class);
System.out.println(user.toString());
}
/**
* post 請求 對象參數 帶有header 帶有restful風格傳參
*/
@Test
public void test13(){
String url = "http://localhost:8080/post4/ww";
//建立Header對象,設定header資訊和請求方式
HttpHeaders headers = new HttpHeaders();
headers.add("token","xxx");
headers.setContentType(MediaType.APPLICATION_JSON);
User user1 = new User();
user1.setId(1111);
user1.setName("fdasf");
user1.setHobby("fdsaf");
//将header資訊和請求參數封裝在HttpEntity中
HttpEntity<User> userHttpEntity = new HttpEntity<>(user1, headers);
User user = restTemplate.postForObject(url, userHttpEntity, User.class);
System.out.println(user.toString());
}
/**
* post 請求 對象參數 表單請求方式 直接使用對象傳參
*/
@Test
public void test14(){
String url = "http://localhost:8080/post5";
User user = new User();
user.setId(222);
user.setName("fdafdsf");
user.setHobby("Fdsafds");
/**
* postForObject:
* url: 請求的位址
* user: 請求的參數-必須是實體對象
* User.class: 傳回值的泛型class
*/
User rs = restTemplate.postForObject(url, user, User.class);
System.out.println(JSON.toJSONString(rs.toString()));
}
/**
* post 請求 對象參數 表單請求方式 使用MultiValueMap傳遞參數
*/
@Test
public void test15(){
String url = "http://localhost:8080/post5";
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("id",111);
map.add("name","fdasf");
map.add("hobby","fdsafdsa");
/**
* postForObject:
* url: 請求的位址
* user: 請求的參數-必須是實體對象
* User.class: 傳回值的泛型class
*/
User rs = restTemplate.postForObject(url, map, User.class);
System.out.println(JSON.toJSONString(rs.toString()));
}
/**
* post 請求 表單請求方式 對象傳參 問号傳參 帶有header 方式2: 使用MultiValueMap傳參
*/
@Test
public void test16(){
String url = "http://localhost:8080/post6?name=nihao";
//建立Header對象,設定header資訊和請求方式
HttpHeaders headers = new HttpHeaders();
headers.add("token","xxx");
headers.setContentType(MediaType.APPLICATION_JSON);
User user1 = new User();
user1.setId(1111);
user1.setName("fdasf");
user1.setHobby("fdsaf");
//将header資訊和請求參數封裝在HttpEntity中
HttpEntity<User> userHttpEntity = new HttpEntity<>(user1, headers);
User user = restTemplate.postForObject(url, userHttpEntity, User.class);
System.out.println(user.toString());
}
/**
* post 請求 表單請求方式 對象傳參 問号傳參 帶有header 方式1: 使用對象傳參
*/
@Test
public void test17(){
String url = "http://localhost:8080/post6?name=nihao";
//建立Header對象,設定header資訊和請求方式
HttpHeaders headers = new HttpHeaders();
headers.add("token","xxx");
headers.setContentType(MediaType.APPLICATION_JSON);
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("id",111);
map.add("name","fdasf");
map.add("hobby","fdsafdsa");
//将header資訊和請求參數封裝在HttpEntity中
HttpEntity<LinkedMultiValueMap<String, Object>> entity = new HttpEntity<>(map, headers);
User user = restTemplate.postForObject(url, entity, User.class);
System.out.println(user.toString());
}
}