最近使用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 = &quot;http://127.0.0.1:12813/member/c2/f02&quot;; // 封装参数,千万不要替换为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":{