原生webservice调用大概逻辑如下:
客户端访问服务端wsdl,根据返回值查到对应需要使用的服务的wsdl service location,根据查询到的location发起真正的数据交换请求。
业务场景:
客户暴露http://127.0.0.1:8082/MsgETLServer/services/general?wsdl端口,但wsdl绑定的端口却是8080,在使用具体接口时,由于网络不通或服务端并未提供8080口时,会出现调用失败。
解决方案:
1. 生成客户端代码:
wsimport -keep -d D:\test\wsimport\d -s D:\test\wsimport\s -p com.iflytek.aisp.job.biz.custom.scdx.proxy -verbose http://127.0.0.1:8082/MsgETLServer/services/general?wsdl
-keep:是否生成java源文件
-d:指定.class文件的输出目录
-s:指定.java文件的输出目录
-p:定义生成类的包名,不定义的话有默认包名
-verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2
2. 使用客户端代码
将代码置于项目,编写测试类:
public static void main(String[] args) { General general = null; try { //使用本地文件 //general = new General(new URL("file:\\D:\\test\\wsimport\\scdx.wsdl")); //使用http地址 general = new General(new URL("http://127.0.0.1:8082/MsgETLServer/services/general?wsdl")); GeneralPortType generalPortType = general.getGeneralHttpSoap11Endpoint(); StringBuilder sb = new StringBuilder(); sb.append("<receipt><item><data_id>").append(56789).append("</data_id><receiptInfo><![CDATA[").append(56789).append("]]></receiptInfo></item></receipt>"); String res = generalPortType.storeData("YIWAN", "YUYIN", sb.toString(), 0); System.out.println(res); } catch (MalformedURLException e) { e.printStackTrace(); } }
当遇到如前面提到的场景时,需要进行如下操作:
3. 浏览器访问或curl wsdl地址,将内容保存为一个wsdl文件。(复制页面中内容保存即可)
4. 修改wsdl中要使用的地址为步骤3中的curl地址(即局方开放的地址)。
5. 将文件保存在与客户端同一环境下,把如上http地址修改为文件绝对路径或相对路径,重新调用测试样例即可。
public static void main(String[] args) { General general = null; try { //使用本地文件 general = new General(new URL("file:\\D:\\test\\wsimport\\scdx.wsdl")); //使用http地址 // general = new General(new URL("http://127.0.0.1:8082/MsgETLServer/services/general?wsdl")); GeneralPortType generalPortType = general.getGeneralHttpSoap11Endpoint(); StringBuilder sb = new StringBuilder(); sb.append("<receipt><item><data_id>").append(56789).append("</data_id><receiptInfo><![CDATA[").append(56789).append("]]></receiptInfo></item></receipt>"); String res = generalPortType.storeData("YIWAN", "YUYIN", sb.toString(), 0); System.out.println(res); } catch (MalformedURLException e) { e.printStackTrace(); } }
运行结果:
使用远程地址时,异常(Connection refused):
使用本地文件并将路径修改一致后,成功: