java调用webservice接口方法整理
这几天在调试webservice接口,记录下调试过程以及遇到的问题;
1: 首先列出几种请求webservice:
AXIS调用远程的webservice
SOAP调用远程的webservice
wsdl2java把WSDL文件转成本地类,然后像本地类一样使用
URL Connection方式
当然http方式也有很多,原生httpconnectin,httpclient,okhttp等都可以,
springboot也有支持的,封装了上面几个的,具体用哪种方式都可以;
2: WebService不适用场景:
1 考虑性能时不建议使用WebService;
2 重构程序下不建议使用WebService;
我们在测试过程中也用postman来测试webservice接口,下面会贴出来postman的方式;
客户接口说明:
客户给到对应webservice的url地址,后缀为wsdl;
里面有两个url:
一个链接是wsdl后缀;
一个url是singleWsdl后缀;
这两个的区别:
wsdl:(嵌入式WSDL)不能使用它来生成WSDL2java包和不能使用JAX-WS创建连接;
singleWsdl:(单个WSDL)它可以使用CXF 3.0的WSDL2java生成Java包,并可以使用JAX-WS创建连接;
其中wsdl文件:
<wsdl:operation name="InfInterfaceForJson"><soap:operation soapAction="http://XXXXX/InfInterfaceForJson" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output>
</wsdl:operation>
这个文件定义了一些方法的说明,上面是我们要调用的方法,
可以看出有输入和输出;
这个文件要关注的点:
1:wsdl:operation:需要调用的方法名
表示客户的接口,一般都会有多少个接口可以跟客户端交流;
2:soap:operation soapAction:
如果是.net生成的服务,soapAction是有值的
3:input:表示调用这个方法需要传入的参数
4:output:表示调用这个方法返回的结果。
其中singleWsdl文件:
<xs:element name="InfInterfaceForJson"><xs:complexType><xs:sequence><xs:element minOccurs="0" name="function" nillable="true" type="xs:string"/><xs:element minOccurs="0" name="json" nillable="true" type="xs:string"/></xs:sequence></xs:complexType>
</xs:element>
<xs:element name="InfInterfaceForJsonResponse"><xs:complexType><xs:sequence><xs:element minOccurs="0" name="InfInterfaceForJsonResult" nillable="true" type="xs:string"/></xs:sequence></xs:complexType>
</xs:element>
说明:
这个文件需要关注的点:
1:targetNamespace=“http://XXXXX”
2:InfInterfaceForJson这个方法是客户提供的通用的json调用方法,
因此我们调用客户的webservice中这个方法,这里面有两个入惨【function】【json】
function:就是我们最终要调用的目标方法名字(客户会给到)
json:目标方法的传参(我们跟客户对接是用的json格式传参的)
3:InfInterfaceForJsonResponse这个是通用的返回;
1:HttpURLConnection 方式
依照上面的客户webservice接口说明:
参数说明:
String urlWsdl:webservice服务地址
String namespace,:
String SOAPAction:
String interfaceName:调用webservice的哪个方法
String function:最终调用的方法名
String json:方法传参
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;/*** webservice 请求工具类*/
@Slf4j
public class CallWebServiceUtils {private static String soapStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"namespaceData\">" +" <soapenv:Header/>" +" <soapenv:Body>" +" <web:interfaceNameData>" +" <web:function>functionData</web:function>" +" <web:json>jsonData</web:json>" +" </web:interfaceNameData>" +" </soapenv:Body>" +"</soapenv:Envelope>";public static String callWebServiceByHttp(String urlWsdl,String namespace, String SOAPAction,String interfaceName,String function, String json){log.info("callWebServiceByHttp begin json:{}",json);/** 关键参数替换 */String soapXML = soapStr.replaceAll("namespaceData",namespace).replaceAll("interfaceNameData",interfaceName).replaceAll("functionData",function).replaceAll("jsonData", json);HttpURLConnection connection = null;try {URL url = new URL(urlWsdl);connection = (HttpURLConnection)url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");connection.setRequestProperty("SOAPAction", SOAPAction);connection.connect();setBytesToOutputStream(connection.getOutputStream(), soapXML.getBytes());if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {byte[] b = getBytesFromInputStream(connection.getInputStream());String back = new String(b);log.info("callWebServiceByHttp end json:{} back:{}", json,JSONObject.toJSONString(back));String returnData = parseResult(back);log.info("callWebServiceByHttp end returnData:{}",returnData);return returnData;} else {log.error("callWebServiceByHttp json:{} httpURLConnection返回状态码:{}",json,connection.getResponseCode());}} catch (Exception e) {e.printStackTrace();} finally {if (connection != null){connection.disconnect();}}log.error("callWebServiceByHttp error json:{}",json);return null;}/*** 向输入流发送数据* @param out* @param bytes* @throws IOException*/private static void setBytesToOutputStream(OutputStream out, byte[] bytes) throws IOException {ByteArrayInputStream bais = new ByteArrayInputStream(bytes);byte[] b = new byte[1024];int len;while ((len = bais.read(b)) != -1) {out.write(b, 0, len);}out.flush();}/*** 从输入流获取数据* @param in* @return* @throws IOException*/private static byte[] getBytesFromInputStream(InputStream in) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] b = new byte[1024];int len;while ((len = in.read(b)) != -1) {baos.write(b, 0, len);}byte[] bytes = baos.toByteArray();return bytes;}/*** 解析结果* @param s* @return*/private static String parseResult(String s) {String result = "";try {Reader file = new StringReader(s);SAXReader reader = new SAXReader();Map<String, String> map = new HashMap<String, String>();// 这个替换为targetNamespacemap.put("ns", "http://XXXXXX");reader.getDocumentFactory().setXPathNamespaceURIs(map);Document dc = reader.read(file);// 这个节点改成你们对应客户接口返回xml格式的数据节点result = dc.selectSingleNode("//ns:InfInterfaceForJsonResult").getText().trim();} catch (Exception e) {e.printStackTrace();}return result;}
}
客户接口返回的是xml:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><InfInterfaceForJsonResponse xmlns="http://XXXX"><InfInterfaceForJsonResult>{"code":"Error","errMsg":"数据不存在","data":""}</InfInterfaceForJsonResult></InfInterfaceForJsonResponse></s:Body>
</s:Envelope>
2:postman 请求webservice
用postman做测试也是极好的:
post请求:
url:客户提供的webservice地址
http://XXXX?wsdl
设置请求头:
SOAPAction:http://XXXX/InfInterfaceForJson
这个是调用具体方法的soapaction(.net才会有这个,具体Java作为webservice提供接口有没有,我也不知道哈,各位自己到时候自己看自己的wsdl文件哈)Content-Type:text/xml;charset=utf-8
请求body:选择raw,XML格式
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="XXXX(targetNamespace)">
<soapenv:Header/>
<soapenv:Body><web:InfInterfaceForJson><web:function>update_user_info</web:function><web:json>{'userId':'123','userName':'李四'}</web:json></web:InfInterfaceForJson>
</soapenv:Body>
</soapenv:Envelope>
调用客户webservice服务中的InfInterfaceForJson方法,其中有两个入参:
function:最终调用的具体方法
json:最终的目标方法的参数
返回xml:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><InfInterfaceForJsonResponse xmlns="http://XXXXX"><InfInterfaceForJsonResult>{"code":"200","msg":"更新成功","data":""}</InfInterfaceForJsonResult></InfInterfaceForJsonResponse></s:Body>
</s:Envelope>
参考文章:
https://www.cnblogs.com/siqi/p/3475222.html
http://www.what21.com/sys/view/java_webservice_1456896211789.html
https://blog.csdn.net/qq_24808729/article/details/80647429
java调用webservice接口方法整理相关推荐
- 【java调用webservice接口方法】
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...
- java 调用webservice 接口,并解析返回参数
java 调用webservice 接口,并解析返回参数 1. 设置传参,例如以下格式: // 确定传参格式以及赋值 String reqXml = "<createAppParam& ...
- java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢
Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...
- Apache CXF生成java代码用java调用Webservice接口
这里写自定义目录标题 使用java调用webservice接口 使用java调用webservice接口 当我们使用java去访问webservice的接口时,有很多种方式,这里我们使用apache ...
- Java 调用第三方接口方法
Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...
- java调用webservice接口(.asmx)
前几天对接阿里云短信接口时,需要调用其他系统的数据,该系统开发人员给我提供了webservice接口.对于从来没见过webservice接口的我,真的是一脸懵.现在把记录一下,方便自己以后用,说不定也 ...
- java 调用webservice接口
RPC调用webservice接口 maven支持包: <dependency><groupId>javax.xml.rpc</groupId><artifa ...
- java调用webService接口的几种方法
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...
- Java调用WebService接口之利用hutool工具包实现
最近要对接金蝶财务系统,对方提供了一个webService接口.而且测试接口地址还是内网的,每改一处代码都要部署堡垒机去测试,光是一个登录接口就花了我两天时间很是无语(主要是接口文档地址不会看) 接口 ...
- java调用webservice接口结果返回空
背景:java程序调用c#写的一个接收处理webservice接口的服务(中转),远程第三方提供真正的接口. 问题:调用结果为list,一个空list 猜想:入参的值有误,返回记录为空:接口有问题,只 ...
最新文章
- iOS开发——手势识别器(用手势实现图片旋转和缩小放大)
- MySQL管理之日志详解
- 深度学习在推荐系统上的应用
- 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 五 NSDicionary + NSMutableDictionary...
- 使用docker中的apline部署自己的golang的后端代码(添加制作静态服务器的注意点)...
- 关系数据库——视图/存储过程/触发器
- 区块链100讲:ERC20 中文版
- IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
- Android实现访斗鱼视频播放
- 外卖跑腿代驾小程序源码
- [工作报告]转载:程序员绩效总结_年终总结怎么写?
- 北邮计算机学院复试分数线,2018年北京邮电大学复试分数线
- HTML Purifier 4.3.0
- End-to-End Object Detection with Fully Convolutional Network 论文笔记
- 【进程线程】1. 概念和区别
- 大数据风控在信贷行业的应用
- Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释
- 单词快速记忆day40
- 华为手机有线共享网络_华为怎么共享热点网络连接(图文)
- 基于android的检测心率,基于android手机的血氧饱和度检测
热门文章
- 在win11系统环境下使用anaconda以及pycharm配置人脸识别库--dlib,face-recognition等
- java 开发技术,Java 后端开发技术有哪些?
- 光栅透过率计算 (Matlab)
- 华硕K40IN关闭触摸板
- 在Mind+下使用Easy loT实现mqtt消息消息的通讯
- FANUC机器人_KAREL编程入门(2)_通用IO信号的使用方法
- SpringBoot整合activiti7,demo示例
- 【Laravel】快速查阅手册
- 华为无线模板之间的应用关系图
- 如何在Mac系统中将照片设置为自动播放以及快速更改壁纸的方法