使用RestTemplate调用第三方接口,获取数据。

需求:最近接触的项目需要和另外的开发团队合作。这就导致了开发模式是调用他们的接口,从而获取数据。

作用:springBoot在这个方面已经为我们提供了一种比较方便的方式。那就是使用RestTemplate。

RestTemplate提供了多种访问Http服务的方式,其中最常用的就是Get请求,Post请求。

Post请求使用方式:代码如下
RestTemplate restTemplate = new RestTemplate();
String url = "http://113.207.68.117:9050/history/findByMap?startTime="+startTime+"&endTime="+endTime;

//1.设置请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
//2.设置请求体的参数
JSONObject param = new JSONObject();
param.put("rtuName", rtuName);
param.put("devId",devId);
HttpEntity<String> formEntity = new HttpEntity<String>(param.toString(), headers);
try{
    
//3.获取接口的数据
    ResponseEntity<Object> response = restTemplate.postForEntity( url, formEntity , Object.class );
    Object body = response.getBody();
   
//4.使用实体封装数据
    String s = JSON.toJSONString(body);
    JSONArray jsonArray = JSONArray.parseArray(s);
  	List<HistoricalMonitoringDataDto> lists = jsonArray.toJavaList(HistoricalMonitoringDataDto.class);
   		    return lists;
        }catch (Exception e){
            return null;
        }
    }

使用说明,分为3步:

首先这个是Post请求的接口。

第一步:需要设置请求头的内容,比如请求数据的格式为 “application/json; charset=UTF-8”。

第二步:如果该接口的请求体中需要的查询参数,比如根据某个属性模糊查询。那就需要在一步使用 JSONObject进行设置。

第三步:获取数据,这里用到了 postForEntity()。在Post请求中,有postForEntity()和getForObject()。

这两个的区别,个人理解就是内容详细与否。postForEntity不仅有业务的信息,还包含了很多response返回的信息。getForObject就直接把Http的业务信息直接转成POJO类 。例如:postForEntity( url, formEntity , “需要封装的实体类” );从而丢失了很多response的信息。这个看具体场景而运用。不过个人比较常用postForEntity。

第四步:信息的封装。例如:我获取到的信息格式是这样的,那封装的时候就需要一个DTO类,字段和这个字段一一对应。

[
 {
        "id": 1294220103537168385, 
        "devId": "2006010013",  //设备id
        "location": null,   //安装地址
        "devGroup": "井盖位移监测终端",  //设备类型(采集组)
        "devVersion": "V4.0", //设备版本
        "softVersion": "V4.0", //软件版本
        "energy": 93,  //电量
        "rtuSignal": 77,  //信号
        "tem": 21,  //温度
        "lng": null,  //经度
        "lat": null,  //纬度
        "altitude": null  //高程
    }
    ...
    {}
]
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GeneralDeviceDto {
    private Double id;  
    private String devId;   
    private String location;   
    private String devGroup;   
    private String devVersion;    
    private String softVersion;   
    private Double energy;    
    private Double rtuSignal;
    private Double tem;
    private Double xaxis;
    private Double yaxis;
    private Double zaxis;
    private Integer isAlarm;
}

到此为止,就可以获取到第三方接口的数据。后续如何使用这些数据看业务需求。

Post请求遇到的一个小坑:请求头设置查询条件的方式。

这种请求头设置方式,虽然接口能够调用成功,但获取不到数据。具体原因尚未知。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE));
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.put("devGroup", devGroup);
map.put("devId",devId);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);

改成方式二:完美解决。

HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
JSONObject param = new JSONObject();
param.put("devGroup", devGroup);
param.put("devId",devId);
HttpEntity<String> formEntity = new HttpEntity<String>(param.toString(), headers);
Get请求使用方式:代码如下
 public List<MDDataDto> acceptMDData(String devID, String startTime, String endTime) {
        //1.查询参数封装
        List<MDDataDto> mdDataList = new ArrayList<>();
        RestTemplate restTemplate = new RestTemplate();
        Map<String,Object> map = new HashMap<>();
        map.put("devId",devID);
        map.put("startTime",startTime);
        map.put("endTime",endTime);
        String url = "http://113.207.68.117:9050/history/listByDevIdByTimes?devId={devId}" +
                "&startTime={startTime}&endTime={endTime}";
        try {
        //2.获取接口数据
            Object forObject = restTemplate.getForObject(url, Object.class, map);
        //3.数据封装    
            String s = JSON.toJSONString(forObject);
            JSONArray jsonArray = JSONArray.parseArray(s);
            MDDataDto mdData = new MDDataDto();
            for (int i=0 ; i<jsonArray.size() ; i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                DevDto devDto = jsonObject.getObject("devDto", DevDto.class);
                JSONArray datas1 = jsonObject.getJSONArray("datas");
                List<ChannelDto> datasList = datas1.toJavaList(ChannelDto.class);
                mdData.setDev(devDto);
                mdData.setDatas(datasList);
                mdDataList.add(mdData);
            }
            return mdDataList;
        }catch (Exception e){
            return null;
        }
    }

使用说明:Get请求其实比Post请求要简单的多。这个代码多的原因是数据封装稍微复杂的原因。我简要说一下

Get请求不需要关注请求头,

第一步:如果有查询参数的话,那就使用 Map<String,Object> map = new HashMap<>();

第二步:后续将这个map加入 restTemplate.getForObject(url, Object.class, map);中,这个需要注意的是map的key值要和url中参数一致,例如:devId={devId} &startTime={startTime}&endTime={endTime}**

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用RestTemplate请求第三方接口时,可以按照以下步骤进行操作: 1. 首先,需要创建一个RestTemplate对象。可以通过new RestTemplate()语句来实现。 2. 接下来,可以使用RestTemplate的getForObject()或postForObject()方法来发送GET或POST请求。这些方法可以接收两个参数:请求的URL和要发送的数据(如果有)。 3. 如果需要在请求头中设置查询条件,可以使用HttpHeaders类来创建请求头对象,并使用setContentType()方法设置请求头的Content-Type为application/json。然后,可以使用LinkedMultiValueMap类来创建一个MultiValueMap对象,将查询参数放入该对象中。 4. 最后,可以创建一个HttpEntity对象,将MultiValueMap对象和HttpHeaders对象作为参数传入。然后,将该对象作为参数传入getForObject()或postForObject()方法中,发送请求并获取响应。 需要注意的是,引用提到了一个小坑:在设置请求头时,需要注意请求头的设置方式。具体原因未知。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用RestTemplate调用第三方接口获取数据。](https://blog.csdn.net/qq_40790367/article/details/108510538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值