这几天在调试webservice接口,记录下调试过程以及遇到的问题;

1: 首先列出几种请求webservice:
  1. AXIS调用远程的webservice
    
  2. SOAP调用远程的webservice
    
  3. wsdl2java把WSDL文件转成本地类,然后像本地类一样使用
    
  4. 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接口方法整理相关推荐

  1. 【java调用webservice接口方法】

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  2. java 调用webservice 接口,并解析返回参数

    java 调用webservice 接口,并解析返回参数 1. 设置传参,例如以下格式: // 确定传参格式以及赋值 String reqXml = "<createAppParam& ...

  3. java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢

    Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...

  4. Apache CXF生成java代码用java调用Webservice接口

    这里写自定义目录标题 使用java调用webservice接口 使用java调用webservice接口 当我们使用java去访问webservice的接口时,有很多种方式,这里我们使用apache ...

  5. Java 调用第三方接口方法

    Java 调用第三方接口方法 一. 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1.通过统一资源 ...

  6. java调用webservice接口(.asmx)

    前几天对接阿里云短信接口时,需要调用其他系统的数据,该系统开发人员给我提供了webservice接口.对于从来没见过webservice接口的我,真的是一脸懵.现在把记录一下,方便自己以后用,说不定也 ...

  7. java 调用webservice接口

    RPC调用webservice接口 maven支持包: <dependency><groupId>javax.xml.rpc</groupId><artifa ...

  8. java调用webService接口的几种方法

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  9. Java调用WebService接口之利用hutool工具包实现

    最近要对接金蝶财务系统,对方提供了一个webService接口.而且测试接口地址还是内网的,每改一处代码都要部署堡垒机去测试,光是一个登录接口就花了我两天时间很是无语(主要是接口文档地址不会看) 接口 ...

  10. java调用webservice接口结果返回空

    背景:java程序调用c#写的一个接收处理webservice接口的服务(中转),远程第三方提供真正的接口. 问题:调用结果为list,一个空list 猜想:入参的值有误,返回记录为空:接口有问题,只 ...

最新文章

  1. iOS开发——手势识别器(用手势实现图片旋转和缩小放大)
  2. MySQL管理之日志详解
  3. 深度学习在推荐系统上的应用
  4. 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 五 NSDicionary + NSMutableDictionary...
  5. 使用docker中的apline部署自己的golang的后端代码(添加制作静态服务器的注意点)...
  6. 关系数据库——视图/存储过程/触发器
  7. 区块链100讲:ERC20 中文版
  8. IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
  9. Android实现访斗鱼视频播放
  10. 外卖跑腿代驾小程序源码
  11. [工作报告]转载:程序员绩效总结_年终总结怎么写?
  12. 北邮计算机学院复试分数线,2018年北京邮电大学复试分数线
  13. HTML Purifier 4.3.0
  14. End-to-End Object Detection with Fully Convolutional Network 论文笔记
  15. 【进程线程】1. 概念和区别
  16. 大数据风控在信贷行业的应用
  17. Java学习之路-----Java基础简介,基础语法,Java标识符,修饰符,关键字与注释
  18. 单词快速记忆day40
  19. 华为手机有线共享网络_华为怎么共享热点网络连接(图文)
  20. 基于android的检测心率,基于android手机的血氧饱和度检测

热门文章

  1. 在win11系统环境下使用anaconda以及pycharm配置人脸识别库--dlib,face-recognition等
  2. java 开发技术,Java 后端开发技术有哪些?
  3. 光栅透过率计算 (Matlab)
  4. 华硕K40IN关闭触摸板
  5. 在Mind+下使用Easy loT实现mqtt消息消息的通讯
  6. FANUC机器人_KAREL编程入门(2)_通用IO信号的使用方法
  7. SpringBoot整合activiti7,demo示例
  8. 【Laravel】快速查阅手册
  9. 华为无线模板之间的应用关系图
  10. 如何在Mac系统中将照片设置为自动播放以及快速更改壁纸的方法