springboot中使用restTemplate发送带参数和请求头的post,get请求
最近在工作中使用到了用restTemplate去获取网站数据填入到数据库中,在这里记录下来以便以后使用:
添加相关依赖:版本使用springboot中的
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
配置以下restTemplate到spring容器中:
@Configuration
public class RestConfig { @Bean //必须new 一个RestTemplate并放入spring容器当中,否则启动时报错
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//单位为ms
factory.setConnectTimeout(5000);//单位为ms
return new RestTemplate(factory);
}
}
代码很简单,一些注解我也写在了代码中
@RequestMapping("/test")
@ResponseBody
public void test() {
try {
RestTemplate restTemplate = new RestTemplate();
URI uri = new URI("http://vs.clouddkj.com/YDS/doPost");
//如果发送的参数数据是json数据的话,需要添加特殊的请求头
//headers.setContentType(MediaType.APPLICATION_JSON);
HttpHeaders headers = new HttpHeaders();
headers.add("Cookie", "ASP.NET_SessionId=vr2d21dftdzblg5edxlp1ytn"); //添加参数,因为HttpEntity里面的参数是MultiValueMap类型的,所以使用这个map集合
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("className", "CloudDot.DC.BLL.DCBLL");
map.add("methodName", "QueryDataLibList");
map.add("params", "[\"\"]");
//添加请求的实体类,这里第一个参数是要发送的参数,第二个参数是请求头里的数据
HttpEntity<Object> requestEntity = new HttpEntity<>(map, headers); //跟下面使用交换机的方法结果一样
/*String s = restTemplate.postForObject(uri, requestEntity, String.class);
JSONObject json = JSON.parseObject(s);
System.out.println(json);*/ ResponseEntity<String> exchange = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, String.class);
//把字符串转换为json
JSONObject jsonObject = JSON.parseObject(exchange.getBody());
System.out.println(jsonObject);
List<Map<String, String>> resultList = (List<Map<String, String>>) jsonObject.get("Result");
for (Map<String, String> obj : resultList) {
System.out.println(obj);
//在这里把你获取到的数据封装到你需要的实体类中,调用你需要的方法即可存入数据库
//......
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
这里有些人可能就有些疑问,为什么参数是要用
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
这种map集合,因为在
HttpEntity<Object> requestEntity = new HttpEntity<Object>(map, headers);
这里面使用的参数类型就是以上map,源码为证:不管你调用的是哪种构造方法,到最后都是调用第四种构造方法,参数就是MultiValueMap类型。
亲测HashMap不行!!!
protected HttpEntity() {
this((Object)null, (MultiValueMap)null);
}
public HttpEntity(T body) {
this(body, (MultiValueMap)null);
}
public HttpEntity(MultiValueMap<String, String> headers) {
this((Object)null, headers);
}
public HttpEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers) {
this.body = body;
HttpHeaders tempHeaders = new HttpHeaders();
if (headers != null) {
tempHeaders.putAll(headers);
}
this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
}
这里再多说一下MultiValueMap这个接口,是一个键对应多个值,value是一个list集合,Spring的内部实现是LinkedMultiValueMap;
LinkedMultiValueMap默认是按照你插入的顺序进行排序。
public interface MultiValueMap<K, V> extends Map<K, List<V>> {
@Nullable
V getFirst(K var1);
void add(K var1, @Nullable V var2);
void addAll(K var1, List<? extends V> var2);
void addAll(MultiValueMap<K, V> var1);
void set(K var1, @Nullable V var2);
void setAll(Map<K, V> var1);
Map<K, V> toSingleValueMap();
}
springboot中使用restTemplate发送带参数和请求头的post,get请求的更多相关文章
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- springboot中使用mybatisplus自带插件实现分页
springboot中使用mybatisplus自带插件实现分页 1.导入mybatisplus分页依赖 <dependency> <groupId>com.baomidou& ...
- JS中的setInterval 函数体带参数f方法
1.setInterval(function code,delaytime); 在设置自动调用执行function code时,我们可以采用下面三种方式来解决. 一.采用字符串形式:(参数不能被周期性 ...
- PHP发送请求头和接收打印请求头
一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...
- Linux中使用curl命令发送带参数的get请求和post请求
GET 请求 curl命令 + 请求接口的地址 curl http://**.**.***.**/SeedAgile/SeedApi/querySprintByRequirementNo?parame ...
- SpringBoot中使用RestTemplate
spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可 ...
- SpringBoot中自定义properties文件配置参数并带有输入提示
1. 创建配置类 在项目中创建一个参数映射类如下 @ConfigurationProperties(prefix = "user.info") public class MyPro ...
- SpringBoot中通过实现WebMvcConfigurer完成参数校验
在Spring5.0和SpringBoot2.0中废弃了WebMvcConfigurerAdapter类. 现有两种解决方案 1 直接实现WebMvcConfigurer (官方推荐)2 直接继承We ...
- laravel 中的 toSql 获取带参数的 sql 语句
默认情况下,toSql 获取到的 sql 里面的参数使用 "?" 代替的,如下: DB::table('user')->where('id', 1)->toSql(); ...
- springBoot中的邮件发送
1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
随机推荐
- TienChin 创建菜单页面
上一节当中我们只是给后台添加了对应的菜单,实际上对应的页面还没有存在这节主要就是创建出来页面: 促销活动: activity 统计分析: analysis 商机管理: business 渠道管理: c ...
- TienChin 开篇-运行 RuoYiVue
开篇 目的: 让大家随心所欲的 DIY 若依的脚手架 不会涉及到太多基础知识 踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑) 下载 RuoYiVue Gitee: https://git ...
- 【6】python生成数据曲线平滑处理——(Savitzky-Golay 滤波器、convolve滑动平均滤波)方法介绍,推荐玩强化学习的小伙伴收藏
相关文章: Python xlwt数据保存到 Excel中以及xlrd读取excel文件画图 先上效果图: 由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过 ...
- 强烈推荐:数据标注平台doccano----简介、安装、使用、踩坑记录
1.doccano的安装与初始配置 1.1 doccano的用途 document classification 文本分类 sequence labeling 序列标注,用于命名实体识别 sequen ...
- P8078 [WC2022] 秃子酋长题解
题目链接: P8078 [WC2022] 秃子酋长 题目所求较难理解,我们考虑转化下,首先这是个 \(1 \sim n\) 的排列,而且要求相邻对应的原位置的绝对值最大我们先考虑最简单的一种情况:\( ...
- (C语言)每日代码||2023.12.23||for循环的循环条件部分可以是数字
#include <stdio.h> int main() { int i = 3; for (i; i; i--) { printf("%d\n", i); } // ...
- 小知识:什么叫做workaround?
技术人当遇到具体问题,能给出的各种解决方案,有一种类型叫做workaround,翻译过来通常为"应变方法"."变通方法": 其实这种方式通常是没有找到根本的解决 ...
- STM32 printf 方法重定向到串口UART
在嵌入式系统中调试代码是很麻烦的一件事, 如果能方便地输出调试信息(与调试者交互), 能使极大加快问题排查的过程. 串口在嵌入式领域是一个比较重要的通讯接口. 因为没有显示设备, 在单片机的程序里调用 ...
- ex命令
ex命令 ex命令用于在Ex模式下启动vim文本编辑器,ex执行效果如同vi -e,如要从Ex模式回到普通模式,则在vim中输入:vi或:visual指令即可,可以通过运行vi -e来启动ex,也可以 ...
- springboot项目读取自定义的properties文件
现在我们要在某个地方读取config.properties里的这几个属性值 这里使用三个注解即可读取自定义的配置文件内容(注意这里需要写他的setter和getter方法) @Component #注 ...