通过WSDL调用WebService服务的两种方法

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

1.使用CXF拉代替码到本地(未解决,但是建议先看这一种)

前提:1.你有一个webservice的地点,里面枚举了你想调用的方法。记住这个地点,后面用CXF拉Java代码的时间地点末了加上.wsdl。
即http://xxx:xx/xx/xx.asmx?wsdl

2.如果你的jdk版本低,可以使用jdk自带的WSDL解析工具,但我的是JDK17,已经移除了,下载使用CXF,我这里下载的是apache-cxf-3.6.4。

在bin目录下实行
  1. wsdl2java -encoding utf-8 -d D:\ file:///E:/web_service/xxxxxx.wsdl
复制代码
到目的路径下拿到代码包,放到你的工程里,它提供了这个wsdl所有的方法,而且会有一个例子(我第一次解析下来的时间没有例子,第二次就有了,可以多试频频),每一个方法都会有一个实例。

添加pom依赖
  1. <dependency>
  2.             <groupId>javax.xml.ws</groupId>
  3.             <artifactId>jaxws-api</artifactId>
  4.             <version>2.3.1</version>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>com.sun.xml.ws</groupId>
  8.             <artifactId>jaxws-rt</artifactId>
  9.             <version>2.3.3</version>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>javax.xml.soap</groupId>
  13.             <artifactId>javax.xml.soap-api</artifactId>
  14.             <version>1.4.0</version>
  15.         </dependency>
  16.         <dependency>
  17.             <groupId>org.glassfish.metro</groupId>
  18.             <artifactId>webservices-rt</artifactId>
  19.             <version>2.4.4</version>
  20.         </dependency>
  21.         <dependency>
  22.             <groupId>com.sun.xml.messaging.saaj</groupId>
  23.             <artifactId>saaj-impl</artifactId>
  24.             <version>3.0.3</version>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.glassfish.metro</groupId>
  28.             <artifactId>webservices-api</artifactId>
  29.             <version>2.4.4</version>
  30.         </dependency>
复制代码
比如我想调用getFieBytes方法

这样就可以调用乐成了,但我遇到的问题是
  1. OuterServiceSoap port = ss.getOuterServiceSoap();
  2. 报错:
  3. Unable to make field private static final jdk.internal.misc.Unsafe jdk.internal.misc.Unsafe.theUnSafe.accessible
复制代码
照旧jdk的问题,我在测试类里可以运行乐成,但是放到src下报这个错误,网上搜的让添加JVM启动参数,我没试过,放弃了这个方法,去用第二种方法了。一般来说,这种方法就可以调用乐成了。
2.直接通过WSDL调用WebService提供的SOAP接口

比如调用getFileBytes方法,WSDL里的方法是

下载SOAPUI测试getFileBytes这个方法是否能够调用乐成。直接复制哀求进去看是否有返回,没有阐明调不通(大概是网络问题,内网访问不到),如果有继承看下面。
不需要加pom依赖
记住这三个东西,我踩了很多坑,少一点或者错一点都报错,还查不到。
先把哀求内容给界说出来
  1. public String getSoapContent(String id, Long fileSize) {
  2.         String content = "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">\n" +
  3.                 "  <soap:Body>\n" +
  4.                 "    <GetFileBytes xmlns="http://tempuri.org/">\n" +
  5.                 "      <fileId>" + id + "</fileId>\n" +
  6.                 "      <pos>0</pos>\n" +
  7.                 "      <length>" + fileSize + "</length>\n" +
  8.                 "    </GetFileBytes>\n" +
  9.                 "  </soap:Body>\n" +
  10.                 "</soap:Envelope>";
  11.         return content;
  12.     }
复制代码
留意:没有"<?xml version="1.0" encoding="utf-8"?>"这一行!!!
如果你加了这一行会报错没有根元素。

然后加上哀求头,发送消息。
  1. //使用SOAP1.1发送消息
  2.     public String doPostSoap(String postUrl, String soapXml, String soapAction) throws Exception {
  3.         String retStr = "";
  4.         // 创建HttpClientBuilder
  5.         HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
  6.         // HttpClient
  7.         CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
  8.         HttpPost httpPost = new HttpPost(postUrl);
  9.         httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
  10.         httpPost.setHeader("SOAPAction", soapAction);
  11.         StringEntity data = new StringEntity(soapXml, Charset.forName("UTF-8"));
  12.         httpPost.setEntity(data);
  13.         CloseableHttpResponse response = closeableHttpClient.execute(httpPost);
  14.         HttpEntity httpEntity = response.getEntity();
  15.         if (httpEntity != null) {
  16.             // 打印响应内容
  17.             retStr = EntityUtils.toString(httpEntity, "UTF-8");
  18.         }
  19.         // 释放资源
  20.         closeableHttpClient.close();
  21.         return retStr;
  22.     }
复制代码
这里HttpPost.setHeaderI(),就是图片里圈出来的哀求头。
拿到的返回值是一个XML文件,解析这个XML文件,如果是getFileBytes这个方法,它返回的值会放在《GetFileBytesResult》这个标签内,返回的格式是base64Binary,拿到二进制流。
  1. public File SoapResponseParser(String soapResponse, String realName, String extName) throws IOException {
  2.         // 找到JSON数组的开始位置和结束位置
  3.         int startIndex = soapResponse.indexOf("<GetFileBytesResult>");
  4.         int endIndex = soapResponse.indexOf("</GetFileBytesResult>");
  5.         String base64String = soapResponse.substring(startIndex + 20, endIndex);
  6.         byte[] decodedBytes = Base64.getDecoder().decode(base64String);
  7.         // 创建一个临时文件
  8.         Path tempFile = Files.createTempFile();
  9.         // 将字节流写入临时文件
  10.         try (FileOutputStream fos = new FileOutputStream(tempFile.toFile())) {
  11.             fos.write(decodedBytes);
  12.         }
  13.         // 返回一个File对象,指向这个临时文件
  14.         return tempFile.toFile();
  15.     }
复制代码
哀求头,哀求体,哀求参数都界说好了之后调用方法
  1. private static final String SOAPACTION = "http://tempuri.org/GetFileBytes";
  2.     private static final String SWDLURL = "http://xx:xx/xx/xxService.asmx?wsdl";
  3. String content = getSoapContent(id, fileSize);
  4.             String postSoap = doPostSoap(SWDLURL, content, SOAPACTION);
  5.             File tempFile = SoapResponseParser(postSoap, realName, extName);
复制代码
拿到文件,接着处置惩罚你本身的逻辑,竣事!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表