RestTemplate - Post实战

一. 方法锦集

二. 方法实战

0. 添加模拟外部Post接口

    /**
     * 模拟外部Post接口
     *
     * @param name 名字
     * @return java.lang.String
     */
    @PostMapping("/postPublic")
    public String postPublic(String name) {
        return "hello " + name + " !";
    }

1. postForEntity 用法A:.postForEntity(请求地址:url/uri均可、参数(key/value)、返回值数据类型);

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author :zhangbocong
 * @version :V1.0
 * @program :spring_boot_demo
 * @date :Created in 2021年5月14日 14:29
 * @description :Post请求案例
 */
@RestController
@RequestMapping("postRest")
public class PostTestController {
    @Value("${server.port}")
    private String port;

    @Resource
    private RestTemplate restTemplate;

    /**
     * postForEntity 方法用法:1
     *
     * @param name 名字
     * @return java.lang.String
     */
    @PostMapping("postForEntityOne")
    public String postForEntityOne(String name) {
        // 请求地址
        String url = "http://localhost:" + port + "/publicData/postPublic";
        // 设置请求参数
        MultiValueMap map = new LinkedMultiValueMap();
        map.add("name", name);
        // 发送请求:.postForEntity(请求地址:url/uri均可、参数(key/value)、返回值数据类型);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
        return responseEntity.getBody();
    }
}

2. postForEntity 用法B:可以按照 get 请求的方式去传递

    /**
     * postForEntity 方法用法:2
     *
     * @param name 名字
     * @return java.lang.String
     */
    @PostMapping("postForEntityTwo")
    public String postForEntityTwo(String name) {
        // 请求地址
        String url = "http://localhost:" + port + "/publicData/postPublic?name={1}";
        // 发送请求:可以按照 get 请求的方式去传递 key/value 形式的参数,传递方式和 get 请求的传参方式基本一致
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, null, String.class, name);
        return responseEntity.getBody();
    }

3. postForEntity 用法C:对象方式

@Data
public class UserEntity {
    private String username;
    private String address;
}
    /**
     * 模拟外部Post接口
     *
     * @param user 用户对象
     * @return 用户对象
     */
    @PostMapping("/user")
    public UserEntity hello(@RequestBody UserEntity user) {
        return user;
    }
    /**
     * postForEntity 方法用法:3
     *
     * @param userEntity 用户对象
     * @return java.lang.String
     */
    @PostMapping("postForEntityThree")
    public UserEntity postForEntityThree(@RequestBody UserEntity userEntity) {
        // 请求地址
        String url = "http://localhost:" + port + "/publicData/user";
        // 发送请求:直接传递 json 数据
        ResponseEntity<UserEntity> responseEntity = restTemplate.postForEntity(url, userEntity, UserEntity.class);
        return responseEntity.getBody();
    }

4. postForObject

  • postForObject 和 postForEntity 基本一致,就是返回类型不同,无法获取请求头而已;

5. postForLocation

  • postForLocation 方法的返回值是一个 Uri 对象,因为 POST 请求一般用来添加数据,有的时候需要将刚刚添加成功的数据的 URL 返回来;
    /**
     * 用户注册(测试需注释掉@RestController ,启用@Controller)
     *
     * @param user 用户对象
     * @return java.lang.String 登录地址url
     */
    @PostMapping("/register")
    public String register(@RequestBody UserEntity user) throws UnsupportedEncodingException {
        return "redirect:/postRest/loginPage?username=" + URLEncoder.encode(user.getUsername(),"UTF-8") + "&address=" + URLEncoder.encode(user.getAddress(),"UTF-8");
    }
    /**
     * 用户登录(配合注册使用)
     *
     * @param user 用户信息对象
     * @return java.lang.String
     */
    @ResponseBody
    @GetMapping("/loginPage")
    public String loginPage( UserEntity user) {
        return "loginPage:" + user.getUsername() + ":" + user.getAddress();
    }

6. map传参

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("grant_type", microsoftConfig.getGrantType());
map.add("client_id", microsoftConfig.getClientId());
map.add("client_secret", microsoftConfig.getClientSecret());
map.add("scope", microsoftConfig.getScope());

ResponseEntity<TokenDo> responseEntity = restTemplate.postForEntity(url, map, TokenDo.class);