对接 Web Service第三方接口

前言

这次也是头一次接触对接第三方WebService接口,这技术都很老了,使用postman测试的时候还找了半天资料🤣。

关于postman测试

一般来说第三方都会限制ip这些,需要注意的是,给到的接口地址是能用公网进行访问的哦。

1、拿到接口路径

http://111.111.11.1:111/services/infoWebService?wsdl

这个当然是不可以访问的,是假的😘。

2、浏览器键入地址

出现这样的xml就代表接口没毛病哦

postman123

3、来到postman 还是同样的操作,将第三方接口地址设为POST请求,如果请求不到可以去掉路径上的 ?wsdl,设置请求头 Content-Type:text/xml;charset=urf-8。

postman1

postman2

注意选中 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、返回数据

postman3

postman4

有没有发现什么不一样地方呢,没错返回的也是xml格式的哦。
还可以发现数据都在我们的data里面,是JSON格式。
这里需要注意的是,想要拿到JSON对象,需要对返回的数据进行截取,详情看后台。

后台调用WebService第三方接口

  1. 根据第三方提供的接口文档,创建对应的实体类,字段最好一致,或者再多写个映射可以实现本地数据库字段与第三方数据库字段不一致 ! !

  2. 想要调用接口,还需要登录拿到Token,使用Token 和资源码调用接口,人家给的文档已经明确说明了。
    word1在postman中:
    postman11
    可以看到是需要(用户名+账号+时间戳)的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;
        }
    }
}
  1. 这个时候我们可以正常获取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,你也可以换别的哦

@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>

至此大公告成!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值