java调用公共数据接口:上海市数据公共开放平台
前言
第一篇中调用了webxml里的QQ在线状态查询的接口,调用方式是http get。但是在日常工作中,会遇到只支持soap接口的调用方式,本文以上海市公共数据开放平台中的接口为案例,给大家作为参考。博主以拿到数据为目标,有更好的方法,欢迎大家评论!
- 后续在项目中会逐步添加以下数据接口:
- 上海市公共数据开放平台
- 阿里云云市场接口(免费+收费)
- 苏州市公共数据平台
- 等等…
为方便以后添加新内容,文章中的步骤比较繁琐,比较着急的同学直接去impl看!
一、找个接口作为案例
我们访问: https://data.sh.gov.cn/可以看到有很多公共接口,我们选一个简单的接口作为案例:
二、查看文档
1.查看接口文档
先找到接口说明与相关文档
2.确认接口地址与参数
打开http://180.168.211.29:8080/jxwjk/services/JXWJK?wsdl,拉到最后。
结合上面文档的内容,我们可以确认:
1.address:http://180.168.211.29:8080/jxwjk/services/JXWJK
2.服务名称:JXWJK
3.方法名(下载的文档里面有):getVwVehicle
3.参数(下载的文档里面有):
hphm:号牌号码(支持模糊查询)
clpp1:中文品牌(支持模糊查询)
zt:状态(支持模糊查询)
fzjg:发证机关(支持模糊查询)
4.返回值(下载的文档里面有):hphm、hpzl、clpp1、zt、fzjg
三、编码(找代码直接跳这里!)
确认好接口内容,新建一个springboot项目,万事俱备,开始敲代码!
项目基础结构在第一篇里面已经创建好了,这边不做介绍。
1.先创建一个返回数据的实体类
- VehicleBaseInfo
- lombok介绍看这里
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @Author: pzc
* @Date: 2020-12-23 17:57
* @Description: *
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class VehicleBaseInfo {
private String hphm;
private String hpzl;
private String clpp1;
private String zt;
private String fzjg;
}
2.编写service和serviceImpl(按正规写法来)
- VehicleInfoService
package com.example.demo.service;
import com.example.demo.entity.VehicleBaseInfo;
import org.jdom2.JDOMException;
import java.io.IOException;
import java.util.List;
/**
* @Author: pzc
* @Date: 2020-12-23 17:49
* @Description: *
*/
public interface VehicleInfoService {
//公共数据平台-获取车辆基本信息
List<VehicleBaseInfo> getBaseInfoVehicle(String hphm, String zt, String clpp1, String fzjg) throws IOException, JDOMException;
}
- VehicleInfoServiceImpl (想直接用的可以只看impl)
package com.example.demo.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.VehicleBaseInfo;
import com.example.demo.service.VehicleInfoService;
import com.example.demo.utils.SoapUtil;
import com.example.demo.utils.XMLUtils;
import org.jdom2.JDOMException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: pzc
* @Date: 2020-12-23 17:51
* @Description: *
*/
@Service
public class VehicleInfoServiceImpl implements VehicleInfoService {
private static Logger logger = LoggerFactory.getLogger(VehicleInfoServiceImpl.class);
@Autowired
private RestTemplate restTemplate;
String baseUrl = "http://180.168.211.29:8080/jxwjk/services/JXWJK";
@Override
public List<VehicleBaseInfo> getBaseInfoVehicle(String hphm, String zt, String clpp1, String fzjg) throws IOException, JDOMException {
ArrayList<String> parameters = new ArrayList<>();
parameters.add(hphm);
parameters.add(clpp1);
parameters.add(zt);
parameters.add(fzjg);
StringBuffer soapString = SoapUtil.getSoapString("getVwVehicle", parameters);
String webServiceAndSoap = null;
webServiceAndSoap = SoapUtil.getWebServiceAndSoap(baseUrl, "JXWJK", "getVehicle", soapString);
JSONObject returnAllXml2Json = XMLUtils.XMLReader(webServiceAndSoap,"utf-8");
JSONArray ResponseALLJson= returnAllXml2Json.getJSONObject("Envelope")
.getJSONArray("Body")
.getJSONObject(0)
.getJSONArray("getVwVehicleResponse")
.getJSONObject(0)
.getJSONArray("out");
JSONObject responseDataJson = XMLUtils.XMLReader(ResponseALLJson.get(0).toString(), "GBK");
JSONArray dataJsonArray = responseDataJson.getJSONObject("Root").getJSONArray("Data");
System.out.println(dataJsonArray);
List<VehicleBaseInfo> vehicleBaseInfos = JSONObject.parseArray(dataJsonArray.toJSONString(),
VehicleBaseInfo.class);
System.out.println(vehicleBaseInfos);
return vehicleBaseInfos;
}
}
3.写个单元测试
异常就先不处理了,。。。大家可以自行优化一下
package com.example.demo;
import com.example.demo.entity.VehicleBaseInfo;
import com.example.demo.service.VehicleInfoService;
import org.jdom2.JDOMException;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.List;
/**
* @author pzc
* @version 1.0
* @date 2021/1/12 11:26
*/
@SpringBootTest
public class VehicleInfoTests {
@Autowired
private VehicleInfoService vehicleInfoService;
@Test
void contextLoads() throws IOException, JDOMException {
List<VehicleBaseInfo> baseInfoVehicle = vehicleInfoService.getBaseInfoVehicle("X70","G","赛","沪");
System.out.println(baseInfoVehicle);
}
}
拿到了list,后面怎么处理就看自己了。
注意:
1.需要实名注册一个账号,不然看不到接口文档
2.该接口商用问题:曾发邮件咨询过对方,未得到正面回应,还是建议不要商用哦!
四、总结
目前完成了项目的第二步,后续有空会添加更多的新的接口功能。
下一篇:XXXXXXXXXXXXXXXXXXXXXXXXXX(等我写完会把它点亮哦!)