RestTemplate 使用:设置请求头、请求体

2年前 (2022) 程序员胖胖胖虎阿
300 0 0

文章目录

    • HttpEntity ⭐
    • 1、为 post、put 请求设置请求头、请求体
    • 2、为其他请求设置请求头、请求体

HttpEntity ⭐

使用 RestTemplate 时可以通过 HttpEntity 设置请求头和请求体。HttpEntity 有4个构造方法:

  1. 既不设置请求体,也不设置请求头
  2. 只设置请求体
  3. 只设置请求头
  4. 同时设置请求体和请求头

HttpEntity 源码:

/**
 * Create a new, empty {@code HttpEntity}.
 */
protected HttpEntity() {
  this(null, null);
}

/**
 * Create a new {@code HttpEntity} with the given body and no headers.
 * @param body the entity body
 */
public HttpEntity(T body) { // 只设置请求体
  this(body, null);
}

/**
 * Create a new {@code HttpEntity} with the given headers and no body.
 * @param headers the entity headers
 */
public HttpEntity(MultiValueMap<String, String> headers) { // 只设置请求头
  this(null, headers);
}

/**
 * Create a new {@code HttpEntity} with the given body and headers.
 * @param body the entity body
 * @param headers the entity headers
 */
public HttpEntity(T body, MultiValueMap<String, String> headers) { // 同时设置请求体与请求头
  this.body = body;
  HttpHeaders tempHeaders = new HttpHeaders();
  if (headers != null) {
      tempHeaders.putAll(headers);
  }
  this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
}

1、为 post、put 请求设置请求头、请求体

如果是为 post、put 请求设置请求头、请求体,可以在调用方法时,利用第二个参数传入 HttpEntity 对象,例如:

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("MyRequestHeader", "MyValue");
HttpEntity requestEntity = new HttpEntity(requestHeaders);

Book book = restTemplate.postForObject("http://127.0.0.1:8080/getbook", requestEntity, Book.class);

PS:public class HttpHeaders implements MultiValueMap<String, String>, Serializable

同时设置请求头和请求体:

    @PostMapping("post_with_body_and_header")
    public void postWithBodyAndHeader(@RequestBody(required = false) UserEntity requestBody) {
        // 1.请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("headerName1", "headerValue1");
        httpHeaders.add("headerName2", "headerValue2");
        httpHeaders.add("headerName3", "headerValue3");
        httpHeaders.add("Content-Type", "application/json"); // 传递请求体时必须设置

        // 2.请求头 & 请求体
        HttpEntity<String> fromEntity = new HttpEntity<>(JSONUtil.toJsonStr(requestBody), httpHeaders);


        MessageBox responseBody = restTemplate.postForObject(INVOKE_URL + "/test/receive", fromEntity, MessageBox.class);
        log.info("响应体:{}", JSONUtil.toJsonPrettyStr(responseBody));
    }

2、为其他请求设置请求头、请求体

如果是其它HTTP方法调用要设置请求头,可以使用exchange()方法:

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("MyRequestHeader", "MyValue");
HttpEntity requestEntity = new HttpEntity(requestHeaders);

HttpEntity<String> response = template.exchange(
        "http://example.com/hotels/{hotel}",
        HttpMethod.GET, 
        requestEntity, 
        String.class, 
        "42"
    );

String responseHeader = response.getHeaders().getFirst("MyResponseHeader");
String body = response.getBody();

版权声明:程序员胖胖胖虎阿 发表于 2022年9月4日 下午9:00。
转载请注明:RestTemplate 使用:设置请求头、请求体 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...