RestTemplate的请求参数传递问题 RestTemplate发送Get请求通过body传参问题
程序员文章站
2022-04-15 17:52:25
RestTemplate能大幅简化了提交表单数据的难度,并且附带了自动转换JSON数据的功能,但只有理解了HttpEntity的组成结构(header与body),且理解了与uriVariables之间的差异,才能真正掌握其用法。此文章主要写了 Get 和 Post请求的 ForObject ,ForEntity 和exchange这三种方式的提交数据话不多说 直接上代码 在启动文件中 配置resttemplate的Bean如果是get请求中携带body中的json数据 这样注入是会报错的 ,...
RestTemplate能大幅简化了提交表单数据的难度,并且附带了自动转换JSON数据的功能,但只有理解了HttpEntity的组成结构(header与body),且理解了与uriVariables之间的差异,才能真正掌握其用法。
此文章主要写了 Get 和 Post请求的 ForObject ,ForEntity 和exchange这三种方式的提交数据
话不多说 直接上代码 在启动文件中 配置resttemplate的Bean
如果是get请求中携带body中的json数据 这样注入是会报错的 ,代码下方有解决方案
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
@org.springframework.web.bind.annotation.RestController
@RequestMapping()
public class RestController {
@Autowired
private RestTemplate restTemplate;
/**
* 使用getForObject url直接携带参数访问 返回的结果是String
* @return
*/
@GetMapping("/get1")
public String getTest1(@RequestParam String id){
String resop = restTemplate.getForObject("http://localhost:6666/gettest/?id=1", String.class);
return resop+"远程调用get1";
}
/**
* 使用getForObject url的参数使用map方式 需要使用这种格式id={id} 返回的结果是String
* @param id
* @return
*/
@GetMapping("/get2")
public String getTest2(@RequestParam String id){
Map<String,String> map = new HashMap();
map.put("id","1");
String resop = restTemplate.getForObject("http://localhost:6666/gettest/?id={id}", String.class,map);
return resop+"远程调用get2";
}
/**
* 使用getForEntity url直接携带参数访问 返回的结果是ResponseEntity类型
* response.getBody()得到 get返回的data
* @param id
* @return
*/
@GetMapping("/get3")
public String getTest3(@RequestParam String id){
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:6666/gettest/?id=1",String.class);
String body = response.getBody();
return body+"远程调用get3";
}
/**
* 使用getForEntity url直接参数使用map 返回的结果是ResponseEntity类型
* response.getBody()得到 get返回的data
* @param id
* @return
*/
@GetMapping("/get4")
public String getTest4(@RequestParam String id){
Map<String,String> map = new HashMap();
map.put("id","1");
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:6666/gettest/?id={id}",String.class,map);
String body = response.getBody();
return body+"远程调用get4";
}
/**
* 使用exchange 请求头部body携带json数据
* * 当使用get请求需要携带 body中的参数的时候 需要重写Http 版本号必须是4.3以上
* 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据
* @param id
* @return
*/
@GetMapping("/get5")
public String getTest5(@RequestParam String id){
/**
* 1)url: 请求地址;
* 2)method: 请求类型(如:POST,PUT,DELETE,GET);
* 3)requestEntity: 请求实体,封装请求头,请求内容
* 4)responseType: 响应类型,根据服务接口的返回类型决定
* 5)uriVariables: url中参数变量值
*/
String jsonData = "{\"test\":\"1234\",\"score\":\"1\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(jsonData, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:6666/getbody/?id=1", HttpMethod.GET, httpEntity, String.class);
return responseEntity.getBody()+"远程调用get5"+responseEntity.getStatusCode();
}
/**
* url参数 使用map 方式
* @param id
* @return
*/
@GetMapping("/get6")
public String getTest6(@RequestParam String id){
//封装url参数
Map<String,String> map = new HashMap();
map.put("id","1");
//设置头部body携带json数据
String jsonData = "{\"test\":\"6666\",\"score\":\"88888\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(jsonData, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:6666/getbody/?id={id}", HttpMethod.GET, httpEntity, String.class,map);
return responseEntity.getBody()+"远程调用get6"+responseEntity.getStatusCode();
}
/**
* 使用本接口访问 直接携带json数据 封装成远程调用的参数 去访问
*
* 当使用get请求需要携带 body中的参数的时候 需要重写Http 版本号必须是4.3以上
* 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据
*
*/
@GetMapping("/getbody")
public String getBody(@RequestParam String id, @RequestBody JSONObject json){
//封装url参数
Map<String,String> map = new HashMap();
map.put("id",id);
//设置头部body携带json数据
String jsonData = json.toJSONString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(jsonData, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:6666/getbody/?id={id}", HttpMethod.GET, httpEntity, String.class,map);
return responseEntity.getBody()+"远程调用get7"+responseEntity.getStatusCode();
}
/**
* postForObject 直接带参数
* @param id
* @return
*/
@PostMapping("/post1")
public String postTest1(@RequestParam String id){
String s = restTemplate.postForObject("http://localhost:6666/posttest/?id=1", null, String.class);
return id+"测试post"+s;
}
/**
* postForObject 使用map 封装 参数
* @param id
* @return
*/
@PostMapping("/post2")
public String postTest2(@RequestParam String id){
//封装url参数
Map<String,String> map = new HashMap();
map.put("id",id);
String s = restTemplate.postForObject("http://localhost:6666/posttest/?id={id}", null, String.class, map);
return id+"测试post"+s;
}
/**
* postForObject 头部携带Json 数据
* @param id
* @param json
* @return
*/
@PostMapping("/postbody")
public String postBody(@RequestParam String id, @RequestBody JSONObject json){
//封装url参数
Map<String,String> map = new HashMap();
map.put("id",id);
//设置头部body携带json数据
String jsonData = json.toJSONString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(jsonData, headers);
String s = restTemplate.postForObject("http://localhost:6666/postbody/?id={id}", httpEntity, String.class, map);
return id+"测试post接收json数据"+s;
}
/**
* post 使用通用的 exchange 访问
* 返回的结果是ResponseEntity 从中拿数据getBody
*/
@PostMapping("/postbody2")
public String postBody2(@RequestParam String id, @RequestBody JSONObject json){
//封装url参数
Map<String,String> map = new HashMap();
map.put("id",id);
//设置头部body携带json数据
String jsonData = json.toJSONString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> httpEntity = new HttpEntity<>(jsonData, headers);
ResponseEntity<String> exchange = restTemplate.exchange("http://localhost:6666/postbody/?id={id}", HttpMethod.POST, httpEntity, String.class, map);
return "测试post接收json数据"+exchange.getBody()+":"+exchange.getStatusCode();
}
}
当使用get请求需要携带 body中的参数的时候 需要重写Http 版本号必须是4.3以上
定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据
pom文件引入
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.4</version>
</dependency>
resttemplate使用配置文件方式 需要把springboot中的@Bean resttemplate注释掉
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
restTemplate.setRequestFactory(new HttpComponentsClientRestfulHttpRequestFactory());
return restTemplate;
}
// 设置超时时间
private SimpleClientHttpRequestFactory getClientHttpRequestFactory() {
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
// Connect timeout 3s
clientHttpRequestFactory.setConnectTimeout(60000);
// Read timeout 3s
clientHttpRequestFactory.setReadTimeout(60000);
return clientHttpRequestFactory;
}
}
定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类
在上面的resttemplate配置文件中需要注入
public class HttpComponentsClientRestfulHttpRequestFactory extends HttpComponentsClientHttpRequestFactory {
@Override
protected HttpUriRequest createHttpUriRequest(HttpMethod httpMethod, URI uri) {
if (httpMethod == HttpMethod.GET) {
return new HttpGetRequestWithEntity(uri);
}
return super.createHttpUriRequest(httpMethod, uri);
}
/**
* 定义HttpGetRequestWithEntity实现HttpEntityEnclosingRequestBase抽象类,以支持GET请求携带body数据
*/
private static final class HttpGetRequestWithEntity extends HttpEntityEnclosingRequestBase {
public HttpGetRequestWithEntity(final URI uri) {
super.setURI(uri);
}
@Override
public String getMethod() {
return HttpMethod.GET.name();
}
}
}
测试的远程端代码如下 端口号 是6666
@RestController
@RequestMapping()
public class HttpController {
@GetMapping("/gettest")
public String getTest(@RequestParam String id){
System.out.println("测试成功");
return id+"测试get";
}
@GetMapping("/getbody")
public String getBody(@RequestParam String id, @RequestBody JSONObject json){
System.out.println("输出"+json.toJSONString());
return id+"测试get接收json数据"+json.toString();
}
@PostMapping("/posttest")
public String postTest(@RequestParam String id){
System.out.println("post测试id"+id);
return id+"测试post";
}
@PostMapping("/postbody")
public String postBody(@RequestParam String id, @RequestBody JSONObject json){
System.out.println("post测试json"+id+" json:"+json.toString());
return id+"测试post接收json数据"+json.toString();
}
}
本文地址:https://blog.csdn.net/fenduo/article/details/109846438
上一篇: Spring框架核心讲解