关于spring:精讲RestTemplate第4篇POST请求方法使用详解

34次阅读

共计 3923 个字符,预计需要花费 10 分钟才能阅读完成。

本文是精讲 RestTemplate 第 4 篇,前篇的 blog 拜访地址如下:

  • 精讲 RestTemplate 第 1 篇 - 在 Spring 或非 Spring 环境下如何应用
  • 精讲 RestTemplate 第 2 篇 - 多种底层 HTTP 客户端类库的切换
  • 精讲 RestTemplate 第 3 篇 -GET 申请应用办法详解

如果您浏览完本文章,感觉对您有帮忙,请帮忙点个赞,您的反对是我不竭的创作能源

在上一节为大家介绍了 RestTemplate 的 GET 申请的两个办法:getForObject()和 getForEntity()。其实 POST 申请办法和 GET 申请办法上大同小异,RestTemplate 的 POST 申请也蕴含两个次要办法:

  • postForObject()
  • postForEntity()

二者的次要区别在于,postForObject()返回值是 HTTP 协定的响应体。postForEntity()返回的是 ResponseEntity,ResponseEntity 是对 HTTP 响应的封装,除了蕴含响应体,还蕴含 HTTP 状态码、contentType、contentLength、Header 等信息。

一、postForObject 发送 JSON 格局申请

写一个单元测试用例,测试用例的内容是向指定的 URL 提交一个 Post(帖子).

@SpringBootTest
class PostTests {

   @Resource
   private RestTemplate restTemplate;

   @Test
   void testSimple()  {
      // 申请地址
      String url = "http://jsonplaceholder.typicode.com/posts";

      // 要发送的数据对象
      PostDTO postDTO = new PostDTO();
      postDTO.setUserId(110);
      postDTO.setTitle("zimug 公布文章");
      postDTO.setBody("zimug 公布文章 测试内容");

      // 发送 post 申请,并输入后果
      PostDTO result = restTemplate.postForObject(url, postDTO, PostDTO.class);
      System.out.println(result);
   }
}
  • jsonplaceholder.typicode.com 是一个能够提供在线收费 RESTful 测试服务的一个网站
  • ”/posts” 服务接管 PostDTO 参数对象,并将申请后果以 JSON 字符串的模式进行响应。响应后果就是申请参数对象对应的 JSON 字符串。
  • 所以 postForObject 办法第二个参数是申请数据对象,第三个参数是返回值类型

最终将返回值的打印后果如下:

二、postForObject 模仿表单数据提交

上面给大家写一个应用 postForObject 模仿表单数据提交的例子,即:提交 x -www-form-urlencoded 格局的数据

@Test
public void testForm() {
   // 申请地址
   String url = "http://jsonplaceholder.typicode.com/posts";

   // 申请头设置,x-www-form-urlencoded 格局的数据
   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

   // 提交参数设置
   MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
   map.add("title", "zimug 公布文章第二篇");
   map.add("body", "zimug 公布文章第二篇 测试内容");

   // 组装申请体
   HttpEntity<MultiValueMap<String, String>> request =
               new HttpEntity<MultiValueMap<String, String>>(map, headers);

   // 发送 post 申请,并打印后果,以 String 类型接管响应后果 JSON 字符串
   String result = restTemplate.postForObject(url, request, String.class);
   System.out.println(result);
}

申请数据打印后果如下:

三、url 反对占位符语法

如果 url 地址下面须要传递一些动静参数,能够应用占位符的形式:

String url = "http://jsonplaceholder.typicode.com/{1}/{2}";
String url = "http://jsonplaceholder.typicode.com/{type}/{id}";

具体的用法和应用 GET 办法申请是统一的,所以请参考:精讲 RestTemplate 第 3 篇 -GET 申请应用办法详解

四、postForEntity()办法

下面的所有的 postForObject 申请传参办法,postForEntity 都能够应用,应用办法上也简直是统一的 ,只是在返回后果接管的时候略有差异。应用ResponseEntity<T> responseEntity 来接管响应后果。用 responseEntity.getBody()获取响应体。响应体内容同 postForObject 办法返回后果统一。剩下的这些响应信息就是 postForEntity 比 postForObject 多进去的内容。

  • HttpStatus statusCode = responseEntity.getStatusCode(); 获取整体的响应状态信息
  • int statusCodeValue = responseEntity.getStatusCodeValue(); 获取响应码值
  • HttpHeaders headers = responseEntity.getHeaders(); 获取响应头
@Test
public void testEntityPoJo() {
   // 申请地址
   String url = "http://jsonplaceholder.typicode.com/posts";

   // 要发送的数据对象
   PostDTO postDTO = new PostDTO();
   postDTO.setUserId(110);
   postDTO.setTitle("zimug 公布文章");
   postDTO.setBody("zimug 公布文章 测试内容");

   // 发送 post 申请,并输入后果
   ResponseEntity<String> responseEntity
               = restTemplate.postForEntity(url, postDTO, String.class);
   String body = responseEntity.getBody(); // 获取响应体
   System.out.println("HTTP 响应 body:" + postDTO.toString());


   // 以下是 postForEntity 比 postForObject 多进去的内容
   HttpStatus statusCode = responseEntity.getStatusCode(); // 获取响应码
   int statusCodeValue = responseEntity.getStatusCodeValue(); // 获取响应码值
   HttpHeaders headers = responseEntity.getHeaders(); // 获取响应头


   System.out.println("HTTP 响应状态:" + statusCode);
   System.out.println("HTTP 响应状态码:" + statusCodeValue);
   System.out.println("HTTP Headers 信息:" + headers);
}

输入打印后果

五、postForLocation() 办法的应用

postForLocation 的传参的类型、个数、用法根本都和 postForObject()或 postForEntity()统一。和前两者的惟一区别在于返回值是一个 URI。该 URI 返回值体现的是:用于提交实现数据之后的页面跳转,或数据提交实现之后的下一步数据操作 URI。

@Test
public void testURI() {
   // 申请地址
   String url = "http://jsonplaceholder.typicode.com/posts";

   PostDTO postDTO = new PostDTO();
   postDTO.setUserId(110);
   postDTO.setTitle("zimug 公布文章");
   postDTO.setBody("zimug 公布文章 测试内容");

   // 发送 post 申请,并输入后果
   URI uri = restTemplate.postForLocation(url,postDTO);
   System.out.println(uri);
}

输入后果如下,含意是:提交了 post 之后,该 post 的 id 是 101,能够通过如下的连贯去获取数据。

欢送关注我的博客,外面有很多精品合集

  • 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》

正文完
 0