准备工作
一个可以调用的WebService接口
调用WebService接口的SoapUI工具
调用Rest接口的Postman/Apipost工具
第一步:解析wsdl
首先接口在浏览器里访问是这样的,一个需要认证的接口
打开SoapUI工具,new一个Project,自定义一下名称和粘贴你的wsdl地址
解析wsdl的时候弹出提示输入账号密码,跟浏览器那边一样,要先认证才能看到wsdl配置
解析完成后,左边的列表树会发现2个接口方法
第二步:用SoapUI调用接口
打开其中一个, 按照接口要求传值调用,我这是调用成功并获取返回值的截图
注:如果是需要认证的接口,要再次配置认证账号和密码,在这里配置,左下角的“Auth”
第三步:用Apipost调用接口
用postman也可以,只不过我们要支持国产,宣传国产。而且Apipost做得也很好,大家也可以试试。
把SoapUI解析出来的接口地址和传参格式复制出来备用
打开Apipost,把接口地址和传参放进去,选择POST方式,raw传参,格式是xml
注:如果是认证接口,在认证这里配置。这里的认证就是Header里的Authorization(key),value是Basic [你的账号密码Base64编码后的字符串]
调用结果和SoapUI一样,说明调用成功了
第四步:用Java代码调用接口
最终都是合并到项目代码里来的,这里调用代码没用httpConnect和httpClient,我用的是国产jar包工具类HuTool,非常方便好用,而且有官网,有API文档,大家可以试试。
直接贴代码了,一眼会。
package 你的包名;
import cn.hutool.http.HttpRequest;
public class RestTest {
public static void main(String args[]) {
String url = "你要调用的WebService接口地址";
String xml = "你要传的request请求参数";
String data = HttpRequest.post(url)
.header("Content-Type", "text/xml")
.header("Authorization", "Basic {你的认证账号密码}")
.header("time", "3600")
.body(xml)
.execute().body();
System.out.println(data);
}
}
完结,撒花!
本来不管是用Axis还是用XFire框架去整合调用都会显得很麻烦,要整合相关类库到项目中需要付出的时间成本,或者使用【generate java code from wsdl(Axis)】功能生成的大量客户端代码,会显得很臃肿,切换接口地址的时候更是头疼。而用这种“另辟蹊径”的方法,会节省很多时间和代码量,很轻松就能达成目标了。
一些未解决的问题
另外问下,用IDEA的generate java code from wsdl无法生成带认证的wsdl,会提示“wsdl url is not valid”。而在浏览器访问后再手动保存wsdl文件,再用这个功能勾选用离线文件生成,调用的时候用Bingdingstub类去调用,已经用.setUsername和.setPassword设置账号密码了,但调用还是不行,这个你们有啥解决方案不?
调用的代码
package 你的包名;
import java.net.URL;
public class MainTest {
public static void main(String args[]) {
try {
PartnerRequest partnerRequest = new PartnerRequest();
partnerRequest.setACCOUNT_GROUP("Z005");
partnerRequest.setBP_CLASS("1");
partnerRequest.setCOMPANY("2600");
partnerRequest.setHAS_CREDIT_CODE("1");
GetPartner getPartner = new GetPartner(partnerRequest);
String url = "你要调用的WebService接口地址";
SI_CUSSUPPLIER_ACCESS_RCVBindingStub stub = new SI_CUSSUPPLIER_ACCESS_RCVBindingStub(new URL(url), new SI_CUSSUPPLIER_ACCESS_RCVServiceLocator());
stub.setUsername("认证的账号");
stub.setPassword("认证的密码");
// 不需要认证的话只要用service对象就可以调用了
SI_CUSSUPPLIER_ACCESS_RCVServiceLocator locator = new SI_CUSSUPPLIER_ACCESS_RCVServiceLocator();
SI_CUSSUPPLIER_ACCESS_RCV service = locator.getHTTPS_Port();
// GetPartnerResponse response = service.cusSupplier_Query(getPartner);// 不需要认证的话只要用service对象就可以调用了
GetPartnerResponse response = stub.cusSupplier_Query(getPartner);// 到这步就报错了
MdmPARTNER mdmPARTNER = response.get_return();
System.out.println(mdmPARTNER.getIS_EXIST());
} catch (Exception e) {
e.printStackTrace();
}
}
}
版权归原作者 吃兔纸不吐毛 所有, 如有侵权,请联系我们删除。