最近在工作中使用到了用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请求的更多相关文章

  1. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  2. springboot中使用mybatisplus自带插件实现分页

    springboot中使用mybatisplus自带插件实现分页 1.导入mybatisplus分页依赖 <dependency> <groupId>com.baomidou& ...

  3. JS中的setInterval 函数体带参数f方法

    1.setInterval(function code,delaytime); 在设置自动调用执行function code时,我们可以采用下面三种方式来解决. 一.采用字符串形式:(参数不能被周期性 ...

  4. PHP发送请求头和接收打印请求头

    一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...

  5. Linux中使用curl命令发送带参数的get请求和post请求

    GET 请求 curl命令 + 请求接口的地址 curl http://**.**.***.**/SeedAgile/SeedApi/querySprintByRequirementNo?parame ...

  6. SpringBoot中使用RestTemplate

    spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可 ...

  7. SpringBoot中自定义properties文件配置参数并带有输入提示

    1. 创建配置类 在项目中创建一个参数映射类如下 @ConfigurationProperties(prefix = "user.info") public class MyPro ...

  8. SpringBoot中通过实现WebMvcConfigurer完成参数校验

    在Spring5.0和SpringBoot2.0中废弃了WebMvcConfigurerAdapter类. 现有两种解决方案 1 直接实现WebMvcConfigurer (官方推荐)2 直接继承We ...

  9. laravel 中的 toSql 获取带参数的 sql 语句

    默认情况下,toSql 获取到的 sql 里面的参数使用 "?" 代替的,如下: DB::table('user')->where('id', 1)->toSql(); ...

  10. springBoot中的邮件发送

    1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

随机推荐

  1. ASP.NET Core必备知识之Autofac

    使用Autofac替换掉微软的DI 本文的项目为ASP.NET Core3.1,传统三层架构 在这就不过多介绍Autofac,直接上代码 Autofac官网:https://autofac.org/ ...

  2. SpringCloud-06-Consul注册中心

    Consul Server Consul 是由 HashiCorp 基于 Go 语言开发的,支持多数据中心,分布式高可用的服务发布和注册服务软件. 用于实现分布式系统的服务发现与配置. 使用起来也较 ...

  3. P4747 [CERC2017] Intrinsic Interval 题解

    题目链接:Intrinsic Interval 讲讲析合树如何解决这种问题,其实这题很接近析合树的板题的应用. 增量法进行析合树建树时,需要用 ST 表预处理出 \(max\) 和 \(min\) 以 ...

  4. (Python)每日代码||2024.1.17||函数中给列表形参默认值时,该默认列表在函数中的改变会保留下来

    def f(x,li=[1]): print(id(li)) li.append(x) print(li) f('a')#第一次调用函数 print() f('b')#第二次调用函数 print() ...

  5. uni-uadmin后台管理系统|uniapp+uView跨端后台框架实例

    基于uniapp+uview+uni-ui跨平台手机端后台管理系统UniappUAdmin. uniapp-uadmin 基于uni-app+uView+uniUI研发的跨端手机后台管理系统项目.全新 ...

  6. C# 重绘图片.图片加字,加矩形,加圆,加线,根据XY坐标修改RGB

    using System; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Ne ...

  7. 思维分析逻辑 4 DAY

    目录 竞品分析 波特五力模型 竞品分析步骤 分析目的 对比分析 初步结论 活动营销分析 用户增长分析 用户增长基本模型 渠道思维(前期) 用户思维(中期) ROI思维(后期) 增长思维 北极星指标:一 ...

  8. push竟比concat快上数百倍?记一个concat在十万级数据引发的性能问题

    壹 ❀ 引 公司产品一直在做企业项目研发工具,所以我们自己当然也会用自己的产品去管理公司大小项目,但在此之前,项目管理体验上一直存在一个卡顿问题.比如我刚登录上账号,在项目里随便到处点点到处跳转页面, ...

  9. JS Leetcode 208. 实现 Trie (前缀树) 题解分析,第一次了解前缀树(字典树)

    壹 ❀ 引 本题来自LeetCode 208. 实现 Trie (前缀树),难度中等,题目描述如下: Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地 ...

  10. OpenWrt 21.02.2 记录: PPPoE, Wireguard

    OpenWrt 21.02 OpenWrt 21.02.2 是 OpenWrt 当前最新的稳定版, 内核 5.4.179, 这个内核已经内置了 Wireguard 模块 root@OpenWrt:~# ...