天天看點

Springboot RestTemplate post/get請求所有情況

項目結構附圖如下:

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());
    }
}

           

繼續閱讀