当前位置:   article > 正文

RestTemplate发送带body参数的post请求_resttemplate post body

resttemplate post body

    在一般的http请求中,post请求是一个绕不过的方法类型,主要是这类请求,可以传输更多更大的参数,甚至是文件。

    一般的参数是属于键值对形式,这种普通的参数每一个都有各自的名字和值,这是最简单的form表单形式,后端在取值的时候,需要根据一个一个参数名来获取参数值。

    还有一种参数是以body请求体方式传递到后台的,一般可以是一个数组,也可以是一个对象,当作为一个对象的时候,需要封装为json格式,后台就通过一个对象来接收,而不用一个一个参数名来接收所有的参数。这个时候,我们后台代码,使用参数注解就是@RequestBody。

    springboot提供了RestTemplate这种http client请求客户端,可以很方便的使用,而不用考虑连接池、重连机制。

   ===============================================================

   使用springboot做一个简单的控制类,分别实现两个方法,一个是form表单提交,一个是body参数提交,来演示今天的主题,并对比两者的不同。

   UserController.java

  1. package com.xxx.webapp.controller;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import com.xxx.webapp.entity.User;
  10. @RestController
  11. @RequestMapping(value = "/user")
  12. public class UserController {
  13. @PostMapping("/formSave")
  14. public Map<String, Object> formSave(@RequestParam("username")String username,@RequestParam("password")String password){
  15. Map<String, Object> result = new HashMap<>();
  16. User user = new User();
  17. user.setUsername(username);
  18. user.setPassword(password);
  19. System.out.println("form parameter method run...");
  20. result.put("code", 200);
  21. result.put("data", user);
  22. return result;
  23. }
  24. @PostMapping("/jsonSave")
  25. public Map<String, Object> jsonSave(@RequestBody User user){
  26. Map<String, Object> result = new HashMap<>();
  27. System.out.println("json parameter method run...");
  28. result.put("code", 200);
  29. result.put("data", user);
  30. return result;
  31. }
  32. }

    启动程序,使用postman测试两个方法:

   1、form表单提    

   2、json体提交      

​​​​​​​

 json体方式提交,参数不能使用form表单了,而是字符串形式的json格式,而且我们要声明header参数Content-Type:application/json。如果不指定ContentType为json格式,那么后台默认会认为他们是普通的文本而抱错:

Content type 'text/plain;charset=UTF-8' not supported

所以一定要做如下所示的请求头设置:

​​​​​​​ 

 关于这个问题,在后面的代码中还会提到。

============================================================

以上只是做了一些准备工作,准备了两个post方法,可以供我们在后面的代码中测试,还没有到今天的主题,RestTemplate,它对以前的httpclient做了一些封装,本质没有发生变化。

  1. package com.xxx.springboot;
  2. import org.springframework.boot.CommandLineRunner;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.http.HttpEntity;
  6. import org.springframework.http.HttpHeaders;
  7. import org.springframework.http.MediaType;
  8. import org.springframework.http.ResponseEntity;
  9. import org.springframework.web.client.RestTemplate;
  10. import com.fasterxml.jackson.databind.ObjectMapper;
  11. import com.fasterxml.jackson.databind.node.ObjectNode;
  12. @SpringBootApplication
  13. //@EnableScheduling
  14. public class App implements CommandLineRunner{
  15. public static final String url = "http://localhost:9000/user/jsonSave";
  16. public static void main( String[] args ){
  17. SpringApplication.run(App.class, args);
  18. }
  19. public static String postForBody() {
  20. String result = "";
  21. HttpHeaders headers = new HttpHeaders();
  22. headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
  23. ObjectMapper objectMapper = new ObjectMapper();
  24. ObjectNode params = objectMapper.createObjectNode();
  25. params.put("username", "buejee2");
  26. params.put("password", "123456");
  27. HttpEntity<String> request = new HttpEntity<String>(params.toString(),headers);
  28. //
  29. RestTemplate restTemplate = new RestTemplate();
  30. ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
  31. if(response.getStatusCodeValue()==200) {
  32. result= response.getBody();
  33. }
  34. return result;
  35. }
  36. @Override
  37. public void run(String... args) throws Exception {
  38. String res = postForBody();
  39. System.out.println(res);
  40. }
  41. }

运行程序,打印信息如下:

  1. 2021-08-14 11:57:15.091 INFO 18919 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8000 (http) with context path '/springboot'
  2. 2021-08-14 11:57:15.207 INFO 18919 --- [ main] com.xxx.springboot.App : Started App in 4.38 seconds (JVM running for 5.256)
  3. {"code":200,"data":{"username":"buejee2","password":"123456"}}

   这里因为请求发送的是json体的body参数,所以请求头也要设置Content-Type,另外,不能再使用键值对(form表单)的那种形式传参数。

   这里也可以给出一个示例,就是按照form表单形式传递参数。

  1. public static String postForForm() {
  2. String result = "";
  3. HttpHeaders headers = new HttpHeaders();
  4. LinkedMultiValueMap<String, Object> params= new LinkedMultiValueMap<>();
  5. params.add("username", "buejee");
  6. params.add("password", "123456");
  7. HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(params,headers);
  8. //
  9. RestTemplate restTemplate = new RestTemplate();
  10. ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
  11. if(response.getStatusCodeValue()==200) {
  12. result= response.getBody();
  13. }
  14. return result;
  15. }

运行结果就不贴了,这两种方式基本涵盖了post请求的用法。如果参数使用不当,后台接口会报错,媒体类型不支持。这个时候就要排查是不是没有设置正确的请求头和请求体。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/303035
推荐阅读
相关标签
  

闽ICP备14008679号