最近使用Spring 的 RestTemplate 工具类请求接口的时候发现参数传递的一个坑,也就是当我们把参数封装在Map里面的时候,Map 的类型选择。 使用RestTemplate post请求的时候主要可以通过三种方式实现
1、调用
postForObject
方法
2、使用
postForEntity
方法
3、调用
exchange
方法
postForObject
和
postForEntity
方法的区别主要在于可以在
postForEntity
方法中设置
header
的属性,当需要指定header的属性值的时候,使用
postForEntity
方法
。
exchange
方法和
postForEntity
类似,但是更灵活,
exchange
还可以调用
get
、put、delete
请求。使用这三种方法调用post请求传递参数,
当接口是表单接收参数的时候
,Map不能定义为以下两种类型(url使用占位符进行参数传递时除外),
HashMap是以请求体传递,MultiValueMap是表单传递!
Map<String, Object> paramMap = new HashMap<String, Object>();
Map<String, Object> paramMap = new LinkedHashMap<String, Object>();
经过测试,我发现这两种map里面的参数都不能被后台接收到,这个问题困扰我两天,终于,当我把Map类型换成
LinkedMultiValueMap
后,参数成功传递到后台
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
经过测试,正确的传参方式如下
public static void main(String[] args) {
RestTemplate template = new RestTemplate();
String url = "http://192.168.2.40:8081/channel/channelHourData/getHourNewUserData";
// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
paramMap.add("dt", "20180416");
// 1、使用postForObject请求接口
String result = template.postForObject(url, paramMap, String.class);
System.out.println("result1==================" + result);
// 2、使用postForEntity请求接口
HttpHeaders headers = new HttpHeaders();
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
ResponseEntity<String> response2 = template.postForEntity(url, httpEntity, String.class);
System.out.println("result2====================" + response2.getBody());
// 3、使用exchange请求接口
ResponseEntity<String> response3 = template.exchange(url, HttpMethod.POST, httpEntity, String.class);
System.out.println("result3====================" + response3.getBody());
GET方式传参说明
如果是get请求,又想要把参数封装到map里面进行传递的话,Map需要使用HashMap,且url需要使用占位符,如下:
public static void main(String[] args) {
RestTemplate restTemplate2 = new RestTemplate();
String url = "http://127.0.0.1:8081/interact/getData?dt={dt}&ht={ht}";
// 封装参数,这里是HashMap
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("dt", "20181116");
paramMap.put("ht", "10");
//1、使用getForObject请求接口
String result1 = template.getForObject(url, String.class, paramMap);
System.out.println("result1====================" + result1);
//2、使用exchange请求接口
HttpHeaders headers = new HttpHeaders();
headers.set("id", "lidy");
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(null,headers);
ResponseEntity<String> response2 = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap);
System.out.println("result2====================" + response2.getBody());
ps:post请求也可以通过占位符的方式进行传参(类似get),但是看起来不优雅,推荐使用文中的方式
补充:使用RestTemplate调用delete、put请求请参考我的另一篇文章:https://blog.csdn.net/LDY1016/article/details/100121146
public static void main(String[] args) {
RestTemplate template = new RestTemplate();
String url = "http://127.0.0.1:12813/member/c2/f02";
// 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
MultiVal...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.7.RELE
String uriTemplate = "http://www.baidu.com";
URI uri = UriComponentsBuilder.fromUriString(uriTempla...
①. getForEntity
①. getForEntity方法的返回值是一个ResponseEntity,ResponseEntity是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。比如下面一个例子:
@RequestMapping("/gethello")
public String getHello() {
restTemplate 发送get/post请求
restemplate发送post请求获取阿里云短信验证码向阿里云发送post请求获取短信验证码测试
java.lang.IllegalStateException: No instances available for dfsns.market.alicloudapi.com
最近要是用RestTemplate做一些操作,这里记录一下。
在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端...
Spring框架之Get请求下的RestTemplate的getForObject和getForEntity的用法,Post请求下的postForObject,postForEntity的用法。
文章目录前言一、准备工作二、RestTemplate模板的Get请求之GetForObject方式1.构造函数1.1 getForObject的构造函数1.2 getForEntity的构造函数2.Get请求方式又分为GetForObject和GetForEntity两种2.1 GetForObject形式2.1.
restTemplate.postForObject() 方法本质上是将对象放入HttpEntity中,然后将对象POST给一个url。
当我想根据时间范围批量删除一些es中的数据,用到了_delete_by_query的方法,在kibana上面写好测试得没问题了,然后我想把kibana上面整个语句直接发送到es上面。
这是我在kibana上面写的
POST center_data/_delete_by_query
"query": {
"bool":{
"must":{