您的位置:

Java RestTemplate发送POST请求

一、RestTemplate简介

RestTemplate是Spring框架提供的一个核心类,用于发送HTTP请求,它集成了多种发送HTTP请求的方法,可以大大简化发送HTTP请求的代码编写。

二、使用RestTemplate发送POST请求

使用RestTemplate发送POST请求很简单,只需要使用其中的postForObject()方法即可。下面是发送POST请求的示例代码:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
JSONObject params = new JSONObject();
params.put("name", "张三");
params.put("age", 20);
HttpEntity request = new HttpEntity<>(params.toJSONString(), headers);
String url = "http://localhost:8080/user";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.postForObject(url, request, String.class);
System.out.println(result);

  

上面的代码中,我们首先创建了一个HttpHeaders对象,并设置其Content-Type为application/json,然后使用JSONObject对象创建了一个包含姓名和年龄的JSON字符串,并将其设置为HttpEntity的body。接着,我们创建了一个RestTemplate对象,并使用postForObject()方法发送POST请求,并传递了URL、HttpEntity和返回值类型作为参数。最后,我们打印出了服务器返回的结果。

三、处理服务器返回值

当服务器返回的结果是JSON字符串时,我们可以使用JSON库(如fastjson)将其转换为Java对象。下面是示例代码:

String result = restTemplate.postForObject(url, request, String.class);
JSONObject jsonResult = JSON.parseObject(result);
User user = JSONObject.toJavaObject(jsonResult.getJSONObject("user"), User.class);

上述代码中,我们首先使用RestTemplate发送POST请求并得到服务器返回的JSON字符串,然后使用fastjson将其转换为JSONObject对象,并从中获取User对象并转换为Java对象。

四、处理异常情况

在发送HTTP请求时,可能会出现一些异常情况,例如连接超时、服务器返回错误等。为了避免这些异常影响我们的程序正常运行,我们可以捕获这些异常并进行相应的处理。下面是示例代码:

try {
    String result = restTemplate.postForObject(url, request, String.class);
    JSONObject jsonResult = JSON.parseObject(result);
    User user = JSONObject.toJavaObject(jsonResult.getJSONObject("user"), User.class);
} catch (HttpStatusCodeException e) {
    String responseBodyAsString = e.getResponseBodyAsString();
    log.error("服务器返回错误:" + responseBodyAsString);
} catch (RestClientException e) {
    log.error("发送HTTP请求失败:" + e.getMessage());
} catch (Exception e) {
    log.error("未知异常:" + e.getMessage());
}

上述代码中,我们使用try-catch语句捕获了HTTP状态码错误和其他RestClientException异常,分别输出了错误信息。同时,我们也捕获了其他未知异常,并输出了其异常信息。

五、使用RestTemplate发送带有Header的POST请求

有些情况下,我们需要在HTTP请求头中添加一些定制化的信息,例如Authorization等,此时我们需要在HttpHeaders中设置对应的Header信息,然后将其作为HttpEntity的头信息发送。下面是示例代码:

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + accessToken);
headers.setContentType(MediaType.APPLICATION_JSON);
JSONObject params = JSONObject.parseObject("{\"name\": \"张三\", \"age\": 20}");
HttpEntity request = new HttpEntity<>(params.toJSONString(), headers);
String url = "http://localhost:8080/user";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.postForObject(url, request, String.class);
System.out.println(result);

  

上述代码中,我们使用HttpHeaders对象设置了Authorization和Content-Type两个Header信息,然后将其作为HttpEntity的头信息发送了POST请求,其中accessToken是我们自己的token。

六、使用RestTemplate发送带有附件的POST请求

有些情况下,我们需要在POST请求中携带附件,例如PDF、图片等文件,此时我们需要将文件流作为附件添加到HttpEntity中,并设置对应的Content-Disposition头信息。下面是示例代码:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
FileSystemResource fileSystemResource = new FileSystemResource(new File("filepath.pdf"));
MultiValueMap form = new LinkedMultiValueMap<>();
form.add("file", fileSystemResource);
form.add("type", "pdf");
HttpEntity
   
    > requestEntity = new HttpEntity<>(form, headers);
String url = "http://localhost:8080/file/upload";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.postForObject(url, requestEntity, String.class);
System.out.println(result);

    
   
  

上述代码中,我们首先创建了一个HttpHeaders对象,并将其Content-Type设置为multipart/form-data,然后使用FileSystemResource对象读取文件并创建MultiValueMap。接着,我们将MultiValueMap作为HttpEntity的body,并设置Content-Disposition头信息,最后使用RestTemplate发送POST请求,并获取服务器返回的结果。

七、小结

使用RestTemplate发送POST请求是非常简单的,只需要参照上述示例代码,根据具体场景设置正确的请求头信息和请求参数即可。同时,对于异常情况的处理也是非常重要的,必要时我们需要打印详细的错误信息以便快速定位问题。