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();
}
复制代码

 

posted @   孙半仙人  阅读(7982)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
哥伦布
17°
00:09发布
哥伦布
00:09发布
17°
东南风
4级
空气质量
相对湿度
25%
今天
多云
2°/18°
周四
雨夹雪
2°/14°
周五
小雪
-2°/5°