最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RestTemplate如何使用JSON發(fā)送Post請求

 更新時間:2023年09月27日 10:17:53   作者:夢想畫家  
這篇文章主要介紹了RestTemplate如何使用JSON發(fā)送Post請求問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

我們說下如何使用Spring的 RestTemplate調(diào)用post請求,發(fā)送json內(nèi)容。

1. 定義服務(wù)端web接口

1.1. 定義業(yè)務(wù)接口

先定義Person實體類表示post請求的數(shù)據(jù):

public class Person {
    private Integer id;
    private String name;
    // standard constructor, getters, setters
}

再定義PersonService接口并實現(xiàn)兩個方法,關(guān)聯(lián)使用Person類:

public interface PersonService {
    public Person saveUpdatePerson(Person person);
    public Person findPersonById(Integer id);
}

這些方法的實現(xiàn)僅返回對象,不再具體討論,讓我們聚焦web層。

1.2. 定義業(yè)務(wù)REST API

下面我們?yōu)镻erson類定義簡單的Rest api:

@PostMapping(value = "/createPerson", consumes = "application/json", produces = "application/json")
public Person createPerson(@RequestBody Person person) {
    return personService.saveUpdatePerson(person);
}
@PostMapping(value = "/updatePerson", consumes = "application/json", produces = "application/json")
public Person updatePerson(@RequestBody Person person, HttpServletResponse response) {
    response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentContextPath()
      .path("/findPerson/" + person.getId()).toUriString());
    return personService.saveUpdatePerson(person);
}

我們需要發(fā)送json格式post請求數(shù)據(jù),為此,在兩個方法的@PostMapping中增加consumes屬性并設(shè)置值為“application/json”。

類似的,設(shè)置produces屬性值為“application/json”,為了告訴Spring我們希望響應(yīng)數(shù)據(jù)也是json格式。

person參數(shù)前的注解@RequestBody,表明person對象和http請求體綁定。

最后兩個方法返回Person對象會綁定至http響應(yīng)體。

如果給api類增加@RestController注解,則所有api方法都帶有@ResponseBody注解。

2. 使用RestTemplate

現(xiàn)在寫幾個單元測試,測試Person rest api。

我們嘗試使用RestTemplate發(fā)送post請求給Person api,

共三個方法:

  • postForObject
  • postForEntity
  • and postForLocation

開始實現(xiàn)單元測試之前,先定義setup方法初始化單元測試方法中使用的對象:

@BeforeClass
public static void runBeforeAllTestMethods() {
    createPersonUrl = "http://localhost:8082/spring-rest/createPerson";
    updatePersonUrl = "http://localhost:8082/spring-rest/updatePerson";
    restTemplate = new RestTemplate();
    headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
   ObjectNode personJsonObject = objectMapper.createObjectNode();
   personJsonObject.put("id", 1);
   personJsonObject.put("name", "John");
}

除了setup方法,還要引入ObjectMapper對象轉(zhuǎn)換JSON字符串為JSONNode對象:

private final ObjectMapper objectMapper = new ObjectMapper();

我們前面提到,post請求數(shù)據(jù)使用json格式。

因此,在請求頭中增加 Content-Type屬性,值為APPLICATION_JSON 。

Spring的 HttpHeaders提供不同的方法訪問請求頭信息。

這里需要通過setContentType方法設(shè)置Content-Type 屬性值為 application/json。然后給請求對象附加頭信息。

2.1. 使用postForObject方法發(fā)送json

RestTemplate的postForObject 方法post對象給uri并返回新的對象。返回值自動被轉(zhuǎn)換為responseType參數(shù)指定的類型,這里是字符串。

我們的需求是發(fā)送post請求至person api,創(chuàng)建新的Person對象并響應(yīng)中包括新創(chuàng)建的對象。

首先,基于personJsonObject構(gòu)建HttpEntity 類型的請求對象,并在請求頭中指定Content-Type。

然后調(diào)用postForObject 方法發(fā)送json請求體:

@Test
public void givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull()
  throws IOException {
    HttpEntity<String> request = new HttpEntity<String>(personJsonObject.toString(), headers);
    String personResultAsJsonStr = restTemplate.postForObject(createPersonUrl, request, String.class);
    JsonNode root = objectMapper.readTree(personResultAsJsonStr);
    assertNotNull(personResultAsJsonStr);
    assertNotNull(root);
    assertNotNull(root.path("name").asText());
}

該示例中 postForObject() 方法返回字符串響應(yīng)體。

我們也可以通過設(shè)置responseType參數(shù)使其返回Person類型:

Person person = restTemplate.postForObject(createPersonUrl, request, Person.class);
assertNotNull(person);
assertNotNull(person.getName());

實際上我們的請求處理方法(createPersonUrl 參數(shù)匹配的)產(chǎn)生json格式的響應(yīng)體,但對postForObject 方法沒有限制,通過設(shè)置responseType參數(shù)可以自動轉(zhuǎn)換為響應(yīng)的java類型。

2.2. 使用postForEntity發(fā)送json

相比于postForObject()方法, postForEntity() 返回響應(yīng)體為 ResponseEntity 類型,其他兩個方法功能一致。

我們的需求是發(fā)送post請求至person api,創(chuàng)建新的Person對象并返回ResponseEntity類型響應(yīng)體。

可以使用postForEntity實現(xiàn)該功能:

@Test
public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull()
  throws IOException {
    HttpEntity<String> request = new HttpEntity<String>(personJsonObject.toString(), headers);
    ResponseEntity<String> responseEntityStr = restTemplate.
      postForEntity(createPersonUrl, request, String.class);
    JsonNode root = objectMapper.readTree(responseEntityStr.getBody());
    assertNotNull(responseEntityStr.getBody());
    assertNotNull(root.path("name").asText());
}

類似的,也可以設(shè)置responseType 參數(shù)轉(zhuǎn)換響應(yīng)體為Java類型。

這里我們能夠返回響應(yīng)體為ResponseEntity,也能返回響應(yīng)為 ResponseEntity 對象,只要設(shè)置responseType參數(shù)為 Person.class:

ResponseEntity<Person> responseEntityPerson = restTemplate.
  postForEntity(createPersonUrl, request, Person.class);
assertNotNull(responseEntityPerson.getBody());
assertNotNull(responseEntityPerson.getBody().getName());

2.3. 使用postForLocation發(fā)送json

與postForObject 和 postForEntity 方法類型, postForLocation 也發(fā)送post請求至特定uri并創(chuàng)建新的對象。

唯一的差異是返回值為Location頭信息。

前面updatePerson rest api在響應(yīng)中設(shè)置Location 頭信息:

response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentContextPath()
  .path("/findPerson/" + person.getId()).toUriString());

現(xiàn)在我們需要實現(xiàn)更新person對象后接收返回帶有Location頭信息的響應(yīng),使用postForLocation 方法:

@Test
public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader() 
  throws JsonProcessingException {
    HttpEntity<String> request = new HttpEntity<String>(personJsonObject.toString(), headers);
    URI locationHeader = restTemplate.postForLocation(updatePersonUrl, request);
    assertNotNull(locationHeader);
}

3. 總結(jié)

本文講解了RestTemplate 如何發(fā)送json類型的post請求,共三種方法應(yīng)用與不同場景。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

临颍县| 环江| 黄陵县| 永兴县| 梅河口市| 横峰县| 南宁市| 金塔县| 新源县| 杨浦区| 四川省| 彰武县| 常德市| 邻水| 东辽县| 普兰店市| 隆子县| 陆良县| 无锡市| 桂阳县| 正定县| 安溪县| 兴文县| 怀来县| 鹤峰县| 平乡县| 资兴市| 丹巴县| 喀喇沁旗| 莱西市| 临清市| 黑龙江省| 汽车| 绍兴县| 松潘县| 武城县| 丹寨县| 银川市| 馆陶县| 兰西县| 汉沽区|