RestTemplate使用JSON Post请求
最后修改:2021年1月30日
1.介绍
在这个快速教程中,我们将演示如何使用Spring创建RestTemplate发送POST请求发送JSON内容。
进一步阅读:
2.建立范例
让我们从添加一个简单的人模型类来表示要发布的数据:
public class Person {private Integer id;私人字符串名称;//标准构造函数
一起工作人对象,我们会添加PersonService接口和实现有两个方法:
public interface PersonService {public Person saveUpdatePerson(Person);public Person findPersonById(整数id);}
这些方法的实现将简单地返回一个对象。我们在这里使用了这个层的虚拟实现,因此我们可以专注于web层。
3.REST API设置
让我们定义一个简单的REST API人类:
@PostMapping(value = "/createPerson", consume = "application/json", produces = "application/json") public Person createPerson(@RequestBody Person Person) {return personService.saveUpdatePerson(Person);} @PostMapping(value = "/updatePerson",消费= "application/json",生成= "application/json") public Person updatePerson(@RequestBody Person Person, HttpServletResponse response) {response. getappdata . getappdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata . getdata。setHeader(“位置”,ServletUriComponentsBuilder.fromCurrentContextPath() .path(“/findPerson/”+ person.getId()). tourisstring ());返回personService.saveUpdatePerson(人);}
记住,我们希望以JSON格式发布数据。为了达到这个目的,我们添加了消耗属性@PostMapping值为" application/json "的注释这两种方法。
类似地,我们设置生产属性到" application/json "来告诉Spring我们想要json格式的响应体。
我们带注释的人参数与@RequestBody两个方法的注释。这将告诉Spring人对象的主体绑定到HTTP请求。
最后,两个方法都返回a人对象,将绑定到响应体。请注意,我们将用它来注释API类@RestController将所有API方法标注为hidden@ResponseBody注释。
4.使用创建RestTemplate
现在我们可以编写一些单元测试来测试人REST API。在这里,我们将尝试发送POST请求到人类提供的POST方法创建RestTemplate:postForObject,postForEntity,postForLocation。
在我们开始实现单元测试之前,让我们定义一个setup方法来初始化我们将在所有单元测试方法中使用的对象:
@BeforeClass public static void runBeforeAllTestMethods() {createPersonUrl = "http://localhost:8082/spring-rest/createPerson";updatePersonUrl = " http://localhost: 8082 / spring-rest / updatePerson”;restTemplate = new restTemplate ();HttpHeaders = new HttpHeaders();headers.setContentType (MediaType.APPLICATION_JSON);personJsonObject = new JSONObject();personJsonObject。put (" id ", 1);personJsonObject。把(“名字”,“约翰”);}
除了这个设置方法之外,请注意,我们将引用下面的映射器来将JSON String转换为JSONNode对象在单元测试中:
private final ObjectMapper ObjectMapper = new ObjectMapper();
正如前面提到的,我们希望以JSON格式发布数据。为了实现这一点,我们将添加一个内容类型Header到我们的请求APPLICATION_JSON媒体类型。
春天的HttpHeaders类提供访问头文件的不同方法。这里,我们设置内容类型头来application / json通过调用setContentType方法。我们会把头反对我们的要求。
4.1。将JSON与postForObject
创建RestTemplate的postForObject方法通过向给定的URI模板发送一个对象来创建一个新资源。控件中指定的类型将自动转换为responseType参数。
假设我们想向人API创建一个新的人对象,并在响应中返回这个新创建的对象。
首先,我们将构建请求类型的对象HttpEntity基于personJsonObject的头文件内容类型。这允许postForObject方法发送一个JSON请求体:
@Test public void givendataisjson_whendataispostdbypostforobject_thenresponsebodyisnotnull () throws IOException {HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);字符串personResultAsJsonStr = restTemplate。postForObject(createPersonUrl, request, String.class); JsonNode root = objectMapper.readTree(personResultAsJsonStr); assertNotNull(personResultAsJsonStr); assertNotNull(root); assertNotNull(root.path("name").asText()); }
的postForObject ()方法将响应体返回为字符串类型。
我们也可以将响应返回为人对象的responseType参数:
Person Person = restTemplate。postForObject(createPersonUrl, request, Person.class); assertNotNull(person); assertNotNull(person.getName());
实际上,我们的请求处理程序方法与createPersonUrlURI以JSON格式生成响应体。
但这不是我们的限制postForObject能够自动将响应体转换为所请求的Java类型(例如:字符串,人),并在responseType参数。
4.2。将JSON与postForEntity
相比postForObject (),postForEntity ()将响应作为ResponseEntity对象。除此之外,两种方法做的是相同的工作。
假设我们想向人API创建一个新的人对象,并将响应作为ResponseEntity。
我们可以利用postForEntity方法来实现:
@Test public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull() throws IOException {HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);ResponseEntity responseEntityStr = restTemplate。postForEntity (createPersonUrl、请求String.class);JsonNode root = objectMapper.readTree(responseEntityStr.getBody());assertNotNull (responseEntityStr.getBody ());assertNotNull (root.path(“名字”).asText ());}
类似于postForObject,postForEntity有responseType参数将响应体转换为请求的Java类型。
这里,我们可以将响应体作为ResponseEntity <字符串>。
我们也可以将响应返回为ResponseEntity <人>对象的responseType参数Person.class:
响应实体响应实体= restTemplate。postForEntity (createPersonUrl、请求Person.class);assertNotNull (responseEntityPerson.getBody ());assertNotNull (responseEntityPerson.getBody () . getname ());
4.3。将JSON与postForLocation
类似于postForObject和postForEntity方法,postForLocation也通过将给定对象发布到给定URI来创建一个新资源。对象的值是唯一的区别位置头。
记住,我们已经知道了如何设置位置的响应头updatePerson以上REST API方法:
响应。setHeader(“位置”,ServletUriComponentsBuilder.fromCurrentContextPath() .path(“/findPerson/”+ person.getId()). tourisstring ());
现在我们想象一下我们想要返回位置更新后的响应头人我们发布的对象。
类来实现这一点postForLocation方法:
@Test public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader()抛出JsonProcessingException {HttpEntity request = new HttpEntity(personJsonObject.toString(), headers);URI locationHeader = restTemplate。postForLocation(updatePersonUrl, request); assertNotNull(locationHeader); }
5.结论
在本文中,我们探索了如何使用创建RestTemplate用JSON发出一个POST请求。
与往常一样,可以找到所有示例和代码片段在GitHub。