RestTemplate实战

介绍

RestTemplate 是 Spring Framework 提供的一个同步 HTTP 客户端,用于与外部服务进行交互。它封装了常见的 HTTP 请求操作,简化了客户端发送 HTTP 请求、接收响应的过程。通过 RestTemplate,你可以轻松地调用 RESTful APIs,处理请求和响应的不同类型(如 JSON、XML、文本等)。


推荐用法

RestTemplate 中包含了许多方法,下面简单列举几个常用的:

  • getForObject(String url, Class responseType)
  • getForEntity(String url, Class responseType)
  • postForObject(String url, Object request, Class responseType)
  • postForEntity(String url, Object request, Class responseType)
  • put(String url, Object request)
  • delete(String url)
  • exchange(String url, HttpMethod method, HttpEntity requestEntity, Class responseType)

实际上我们不需要为了学习 RestTemplate 去记住所有的方法,简单挑选几个常用的掌握,等到实际用到时,结合相应文档自然会得心应手。

读操作 GET / HEAD

public void test_get() {
    ResponseEntity forEntity = restTemplate.getForEntity("http://localhost:8080/get", String.class);
    System.out.println(forEntity.getBody());

    String forObject = restTemplate.getForObject("http://localhost:8080/get", String.class);
    System.out.println(forObject);
}

public void test_get_person() {
    ResponseEntity forEntity = restTemplate.getForEntity("http://localhost:8080/person/get", Person.class);
    System.out.println(forEntity.getBody().getName());

    Person forObject = restTemplate.getForObject("http://localhost:8080/person/get", Person.class);
    System.out.println(forObject.getName());
}

public void test_head() {
    HttpHeaders httpHeaders = restTemplate.headForHeaders("http://localhost:8080/get");
    System.out.println(httpHeaders);
}

写操作 POST / PUT / PATCH / DELETE

public void test_post() {
    RequestEntity requestEntity = new RequestEntity<>(
            body,
            headers,
            HttpMethod.POST,
            URI.create("http://localhost:8080/post")
    );

    ResponseEntity exchange = restTemplate.exchange(requestEntity, String.class);
    System.out.println(exchange.getStatusCode());
    System.out.println(exchange.getHeaders());
    System.out.println(exchange.getBody());
}

public void test_put() {
    RequestEntity requestEntity = new RequestEntity<>(
            body,
            headers,
            HttpMethod.PUT,
            URI.create("http://localhost:8080/put")
    );

    ResponseEntity exchange = restTemplate.exchange(requestEntity, String.class);
    System.out.println(exchange.getStatusCode());
    System.out.println(exchange.getHeaders());
    System.out.println(exchange.getBody());
}

public void test_patch() {
    RequestEntity requestEntity = new RequestEntity<>(
            body,
            headers,
            HttpMethod.PATCH,
            URI.create("http://localhost:8080/patch")
    );

    ResponseEntity exchange = restTemplate.exchange(requestEntity, String.class);
    System.out.println(exchange.getStatusCode());
    System.out.println(exchange.getHeaders());
    System.out.println(exchange.getBody());
}

public void test_delete() {
    RequestEntity requestEntity = new RequestEntity<>(
            null,
            headers,
            HttpMethod.DELETE,
            URI.create("http://localhost:8080/delete")
    );

    ResponseEntity exchange = restTemplate.exchange(requestEntity, String.class);
    System.out.println(exchange.getStatusCode());
    System.out.println(exchange.getHeaders());
    System.out.println(exchange.getBody());
}


对比 ResponseEntity RequestEntity

RequestEntity

RequestEntity 是 HttpEntity 的一个子类,专门用于表示 HTTP 请求。它不仅封装了请求的 头部 和 正文,还包括 HTTP 方法(如 GET, POST, PUT, DELETE)和 URL,可以更全面地描述一个 HTTP 请求。

RequestEntity requestEntity = new RequestEntity<>(
    body, 
    headers, 
    httpMethod, 
    url
);

ResponseEntity

ResponseEntity 是 HttpEntity 的另一个子类,专门用于表示 HTTP 响应。它除了包含 HTTP 响应的 头部 和 正文 外,还封装了 HTTP 状态码。

ResponseEntity responseEntity = new ResponseEntity<>(
    body, 
    headers, 
    statusCode
);


相关配置

超时

默认情况下,RestTemplate 会使用 SimpleClientHttpRequestFactory,它使用 HttpURLConnection 来执行 HTTP 请求。这个实现是同步的,并且比较简单,只适合一些轻量级的应用。

@Bean
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    // 连接超时是指客户端在尝试建立连接时,等待服务器响应的最大时间
    factory.setConnectTimeout(1000);
    // 发送请求后,等待响应数据的最大时间
    factory.setReadTimeout(1000);

    return new RestTemplate(factory);
}

拦截器

最常见的用法在 header 中设置 jwt token。

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();

    // 自定义请求拦截器
    restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() {
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body,
                                            ClientHttpRequestExecution execution) throws IOException {
            request.getHeaders().set("Authorization", "Bearer your_token by Interceptor");
            return execution.execute(request, body);
        }
    });

    return restTemplate;
}


参考

https://www.baeldung.com/rest-template#bd-overview

你可能感兴趣的:(spring)