一、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<String> 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<String> 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<String, Object> form = new LinkedMultiValueMap<>();
form.add("file", fileSystemResource);
form.add("type", "pdf");
HttpEntity<MultiValueMap<String, Object>> 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请求是非常简单的,只需要参照上述示例代码,根据具体场景设置正确的请求头信息和请求参数即可。同时,对于异常情况的处理也是非常重要的,必要时我们需要打印详细的错误信息以便快速定位问题。