restTemplate 调用第三方接口获取json数据

简介: restTemplate 调用第三方接口获取json数据

👏作者简介:大家好,我是Rockey,不知名企业的不知名Java开发工程师

🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦


什么是RestTemplate


RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用。


第一步 ,首先导入依赖 RestTemplate的方式来调用别人的API,将数据转化为json 格式,引入了fastjson


<!--引入了fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <!--restTemplate httpclient 相关依赖-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
• 13

第二步,编写RestTemlateConfig,配置好相关信息



package com.chx.disService.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(5000);
        return factory;
    }
}


第三步,在controller包中 编写controller,调用第三方的API,实现get请求和post请求 这个是别人的


import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
@RestController
public class SpringRestTemplateController {
    @Autowired
    private RestTemplate restTemplate;
    /***********HTTP GET method*************/
    @GetMapping("/testGetApi")
    public String getJson(){
        String url="http://localhost:8089/o2o/getshopbyid?shopId=19";
        //String json =restTemplate.getForObject(url,Object.class);
        ResponseEntity<String> results = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
        String json = results.getBody();
        return json;
    }
    /**********HTTP POST method**************/
    @PostMapping(value = "/testPost")
    public Object postJson(@RequestBody JSONObject param) {
        System.out.println(param.toJSONString());
        param.put("action", "post");
        param.put("username", "tester");
        param.put("pwd", "123456748");
        return param;
    }
    @PostMapping(value = "/testPostApi")
    public Object testPost() {
        String url = "http://localhost:8081/girl/testPost";
        JSONObject postData = new JSONObject();
        postData.put("descp", "request for post");
        JSONObject json = restTemplate.postForEntity(url, postData, JSONObject.class).getBody();
        return json;
    }
}

下面这个是自己写的post方式请求第三方API接口


@PostMapping(value = "/test3PostApi")
    public Object testPost1(@RequestBody JSONObject param) throws URISyntaxException {
        RestTemplate restTemplate = new RestTemplate();
        //这里的url是自己项目的接口
        URI uri = new URI("http://vs.clouddkj.com/YDS/doPost");
//        String appCode = "52cc0ea3aaf24eb7a1250f327fea9f25";
        HttpHeaders headers = new HttpHeaders();
        //设置请求头为json格式
        headers.set("Accept-Charset", "UTF-8");
        headers.set("Content-Type", "application/json; charset=utf-8");
//        headers.add("Authorization", "APPCODE " + appCode);
        //添加参数,因为HttpEntity里面的参数是MultiValueMap类型的,所以使用这个map集合
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("id","7");
        map.add("beginDate", "2020-04-26 10:00:00");
        map.add("endDate", "2021-04-21 10:00:00");
        map.add("version", "3");
        map.add("sign", "e4");
        //添加请求的实体类,这里第一个参数是要发送的参数,第二个参数是请求头里的数据
        HttpEntity<Object> requestEntity = new HttpEntity<>(map, headers);
        //第一种方法
        String s = restTemplate.postForObject(uri, requestEntity, String.class);
        JSONObject jsonObject = JSON.parseObject(s);
        System.out.println(jsonObject);
       /*
        //第二种方法
        //发送post请求
        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);
            //在这里把你获取到的数据封装到你需要的实体类中,调用你需要的方法即可存入数据库
            //......
        }
        return jsonObject;
    }

上面里面的post里面的参数可以不写主要是里面的设置的map里面的值


测试成功


也可以用swagger测试也可以成功

这里有些人可能就有些疑问,为什么参数是要用


MultiValueMap<String, String> map = new LinkedMultiValueMap<>();

这种map集合,因为在

HttpEntity<Object> requestEntity = new HttpEntity<Object>(map, headers);


这里面使用的参数类型就是以上map,源码为证:不管你调用的是哪种构造方法,到最后都是调用第四种构造方法,参数就是MultiValueMap类型。

亲测HashMap不行!!!

这里再多说一下MultiValueMap这个接口,是一个键对应多个值,value是一个list集合,Spring的内部实现是LinkedMultiValueMap;

LinkedMultiValueMap默认是按照你插入的顺序进行排序。

参考

RestTemplate 调用第三方接口


结语


🔥一个人可以掌握知识,但只有与他人交流才能形成智慧。

🔥One person can acquire knowledge, but wisdom is formed only in the exchange with others.

🏆 我坚信人与人之间的差距是表面上是财富的差距,本质上是大脑中认知的差距,


我们下期再见。

相关文章
|
8天前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
25 1
|
6天前
|
存储 JSON Go
在Gin框架中优雅地处理HTTP请求体中的JSON数据
在Gin框架中优雅地处理HTTP请求体中的JSON数据
|
9天前
|
JSON JavaScript 数据格式
vue写入json数据到文本中+vue引入cdn的用法
vue写入json数据到文本中+vue引入cdn的用法
|
7天前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
17 0
Blob格式转json格式,拿到后端返回的json数据
|
2月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
22天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求
|
25天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
62 0
|
4月前
|
JSON JavaScript 测试技术
掌握JMeter:深入解析如何提取和利用JSON数据
Apache JMeter教程展示了如何提取和使用JSON数据。创建测试计划,包括HTTP请求和JSON Extractor,设置变量前缀和JSON路径表达式来提取数据。通过Debug Sampler和View Results Tree监听器验证提取结果,然后在后续请求和断言中使用这些数据。此方法适用于复杂测试场景,提升性能和自动化测试效率。
129 0
|
2月前
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
3月前
|
存储 JSON JavaScript
使用JSONObject解析与生成JSON数据
使用JSONObject解析与生成JSON数据