前言
这次也是头一次接触对接第三方WebService接口,这技术都很老了,使用postman测试的时候还找了半天资料🤣。
关于postman测试
一般来说第三方都会限制ip这些,需要注意的是,给到的接口地址是能用公网进行访问的哦。
1、拿到接口路径
http://111.111.11.1:111/services/infoWebService?wsdl
这个当然是不可以访问的,是假的😘。
2、浏览器键入地址
出现这样的xml就代表接口没毛病哦
3、来到postman 还是同样的操作,将第三方接口地址设为POST请求,如果请求不到可以去掉路径上的 ?wsdl,设置请求头 Content-Type:text/xml;charset=urf-8。
注意选中 raw 格式选择 XML 。
标号 1 的地方就是我们的方法名称。
标号 2 的地方就是我们的 targetNamespace 里的内容。
标号 3 的地方就是我们的方法返回类型。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ns1:applyInfo xmlns:ns1="http://service.webservice.catalog.infotrust.com">
<ns1:in0>
<![CDATA[
{
"token":"31cf2fba490b4714aa0b601fe0e25481",
"rescode":"892d615e9cec4b0a8fff9da2099bf2e7"
}
]]>
</ns1:in0>
</ns1:applyInfo>
</soap:Body>
</soap:Envelope>
参数就需要你自己去参照第三方给到你的文档了哦。
4、返回数据
有没有发现什么不一样地方呢,没错返回的也是xml格式的哦。
还可以发现数据都在我们的data里面,是JSON格式。
这里需要注意的是,想要拿到JSON对象,需要对返回的数据进行截取,详情看后台。
后台调用WebService第三方接口
-
根据第三方提供的接口文档,创建对应的实体类,字段最好一致,或者再多写个映射可以实现本地数据库字段与第三方数据库字段不一致 ! !
-
想要调用接口,还需要登录拿到Token,使用Token 和资源码调用接口,人家给的文档已经明确说明了。
在postman中:
可以看到是需要(用户名+账号+时间戳)的MD5值,那还需要一个操作获取时间戳和MD5Key
/**
* 获取MD5Key和时间戳
*/
@Slf4j
public class DSFToken {
/**
* 获取MD5Key和时间戳
*/
public Map<String,String> getMd5KeyAndTimeStamp()throws Exception{
Map<String,String> map = new HashMap<>();
Long timestamp = getTimestamp();
String md5key = getMD5s("test123tD8#mE5["+timestamp);
map.put("timestamp",timestamp.toString());
map.put("md5key",md5key);
return map;
}
/**
* 获取当前时间戳
*/
public Long getTimestamp() throws Exception {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
Instant instant = timestamp.toInstant();
Timestamp tsFromInstant = Timestamp.from(instant);
return tsFromInstant.getTime();
}
/**
* 获取MD5值
* @param plainText
* @return
*/
public String getMD5s(String plainText)throws Exception {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
//32位加密
return buf.toString();
// 16位的加密
//return buf.toString().substring(8, 24);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}
- 这个时候我们可以正常获取token了
/**
* 获取登录token
* @return
* @throws Exception
*/
public String getToken() throws Exception {
DSFToken dsf = new DSFToken();
Map<String,String> map = dsf.getMd5KeyAndTimeStamp();
//获取时间戳
String timestamp = map.get("timestamp");
//获取md5key值
String md5key = map.get("md5key");
//WebService外网访问ip地址
String SERVER_IP_TEST = "http://********/services/infoWebService";
//通过StringBuilder拼接请求
StringBuilder paramValue = new StringBuilder();
paramValue.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
"<soap:Body>\n" +
"<ns1:getSafeToken xmlns:ns1=\"http://service.webservice.catalog.infotrust.com\">\n" +
"<ns1:in0>\n" +
"<![CDATA[\n" +
"{\"username\":\"test123\",\"md5key\":\""+ md5key +"\",\"timestamp\":\""+timestamp+"\"}\n" +
"]]>\n" +
"</ns1:in0>\n" +
"</ns1:getSafeToken>\n" +
"</soap:Body>\n" +
"</soap:Envelope>");
//调用post请求方法
String result = sendPost(SERVER_IP_TEST,paramValue.toString());
//由于返回的是XML我们需要对返回的数据进行截取,才能获得想要的
String str1 = result.substring(result.indexOf("t>"),result.indexOf("</n")).substring("t>".length());
if (str1 != null) {
//转JSONObject格式
JSONObject jsonObject = JSON.parseObject(str1);
if(jsonObject.get("token") != null){
// redisDao.setStringAndTime("dsfToken",jsonObject.getString("token"),3600*24);//redis缓存一天
return jsonObject.getString("token");
}
}
throw new BaseException("联系管理员");
}
4. 拿到Token调用接口,使用Token 和资源码 (固定的) 获取数据 并将数据存储到本地数据库
public List<AeoInfo> updateAeoInfo() throws Exception {
//资源码
String rescode = "c9769a4d208d41a99c1d847b68ccf1b4";
//获取token
String token = getToken();
// if(token==null){
// redisDao.setStringAndTime("dsfToken",getToken(),3600*24);//redis缓存一天
// token = redisDao.get("dsfToken");
// }
//WebService外网访问ip地址
String SERVER_IP_TEST = "http://********/services/infoWebService";
//通过StringBuilder拼接请求
StringBuilder paramValue = new StringBuilder();
paramValue.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
"<soap:Body>\n" +
"<ns1:applyInfo xmlns:ns1=\"http://service.webservice.catalog.infotrust.com\">\n" +
"<ns1:in0>\n" +
"<![CDATA[\n" +
"{\n" +
"\"token\":\"" + token +"\",\n" +
"\"rescode\":\"" + rescode + "\"}\n" +
"]]>\n" +
"</ns1:in0>\n" +
"</ns1:applyInfo>\n" +
"</soap:Body>\n" +
"</soap:Envelope>");
//调用post请求方法
String result = sendPost(SERVER_IP_TEST,paramValue.toString());
//截取字符串
String str1 = result.substring(result.indexOf("t>"),result.indexOf("</n")).substring("t>".length());
if (str1 != null) {
//转JSONObject格式
JSONObject jsonObject = JSON.parseObject(str1);
if (jsonObject.get("data") != null) {
//转对象格式
List<AeoInfo> entisyList = JSON.parseArray(jsonObject.getString("data"),AeoInfo.class);
if(entisyList != null && entisyList.size()>0){
for (AeoInfo entity : entisyList) {
//通过某个字段可以实现数据库中没有就新增,有就更新的效果,JPA的写法
//你们对接接口的时候,需要自己去选择以哪个字段为准哦
AeoInfo adminLicensing = aeoInfoRepository.findByRN(entity.getRN());
if(adminLicensing==null){
//保存
aeoInfoRepository.save(entity);
}
}
}
return entisyList;
}
}
return null;
}
工具
用来发送Post请求的方法,用到的是restTemplate,你也可以换别的哦文章来源:https://www.toymoban.com/news/detail-410810.html
@Autowired
private RestTemplate restTemplate;
/**
* post请求、请求参数为json
* @return
*/
public String sendPost(String uri, String params) {
ResponseEntity<String> apiResponse = restTemplate.postForEntity
(
uri,
generatePostJson(params),
String.class
);
return apiResponse.getBody();
}
/**
* 生成post请求的JSON请求参数
* @return
*/
public HttpEntity<String> generatePostJson(String params) {
//如果需要其它的请求头信息、都可以在这里追加
HttpHeaders httpHeaders = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
httpHeaders.setContentType(type);
HttpEntity<String> httpEntity = new HttpEntity<>(params, httpHeaders);
return httpEntity;
}
XML配置
<!--定时任务和@Slf4j注解日志的依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!--json依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
</dependency>
<!-- apache md5 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<!-- RestTemplate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
至此大公告成!文章来源地址https://www.toymoban.com/news/detail-410810.html
到了这里,关于对接 Web Service第三方接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!