当前位置: 首页 > news >正文

Java 调用 WebService 服务的 3 种方式

虽然 WebService 这个框架已经过时,但是有些公司还在使用,在调用他们的服务的时候就不得不面对各种问题,本篇文章总结了最近我调用他司 WebService 的心路历程。3 种方式可以分别尝试,哪种能通用哪个。

soapui 下载地址:百度网盘、夸克网盘。

1. HttpClient

依赖:

        <!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- Apache Http httpclient_version--><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.1.3</version></dependency>

代码:

import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.HttpEntity;@Slf4j
public class HttpClientUtil {/*** HttpClient 调用 WebService* @param wsUrl webService地址,格式:http://ip:port/xxx/xxx/soap?wsdl* @param json格式的入参* @return*/public static String callServiceHC(String wsUrl, String jsonStr) {String xml = createSoapContent(jsonStr);String returnDatabase = doPostSoap(wsUrl, xml, "");log.info("returnDatabase===>{}", returnDatabase);return returnDatabase;}/*** 根据拼接 xml 字符串* @param input* @return*/public static String createSoapContent(String jsonStr) {log.info("开始拼接请求报文");//开始拼接请求报文StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:zys=\"http://www.chenjy.com.cn/\">\n");stringBuilder.append("<soapenv:Header/>\n");stringBuilder.append("<soapenv:Body>\n");stringBuilder.append("<cjy:CallInterface>\n");stringBuilder.append("<cjy:msgHeader><![CDATA[\n");stringBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");stringBuilder.append("<root>\n");stringBuilder.append("<serverName>getInfo</serverName>\n");stringBuilder.append("<format>xml</format>\n");stringBuilder.append("<callOperator>测试</callOperator>\n");stringBuilder.append("<certificate>AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==</certificate>\n");stringBuilder.append("</root>\n");stringBuilder.append("]]></cjy:msgHeader>\n");stringBuilder.append("<cjy:msgBody><![CDATA[\n");stringBuilder.append( jsonStr+ "\n");stringBuilder.append("]]></cjy:msgBody>\n");stringBuilder.append("</cjy:CallInterface>\n");stringBuilder.append("</soapenv:Body>\n");stringBuilder.append("</soapenv:Envelope>");log.info("拼接后的参数"+stringBuilder.toString());return stringBuilder.toString();}/*** HTTPClient 调用 WebService* @param url* @param soap* @param SOAPAction* @return*/public static String doPostSoap(String url, String soap, String SOAPAction) {//请求体String retStr = "";// 创建HttpClientBuilderHttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// HttpClientCloseableHttpClient closeableHttpClient = httpClientBuilder.build();HttpPost httpPost = new HttpPost(url);try {httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");httpPost.setHeader("SOAPAction", SOAPAction);StringEntity data = new StringEntity(soap,Charset.forName("UTF-8"));httpPost.setEntity(data);CloseableHttpResponse response = closeableHttpClient.execute(httpPost);HttpEntity httpEntity = response.getEntity();if (httpEntity != null) {// 打印响应内容retStr = EntityUtils.toString(httpEntity, "UTF-8");}// 释放资源closeableHttpClient.close();} catch (Exception e) {e.printStackTrace();}return retStr;}
}

注意:拼接 xml 字符串的时候要根据实际的 WebService 地址拼接,可在 soapui 中导入 wsurl 获取到入参,如下:

把这些参数全部拼接进去:

补充:忽略 ssl 验证,调用WebService接口

    public static String sendPostByHttpsWithoutSSL(String url, String body,  String SOAPAction) {SSLConnectionSocketFactory sslConnectionSocketFactory = null;try {sslConnectionSocketFactory =new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {return true;}}).build(), NoopHostnameVerifier.INSTANCE);}catch(NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {e.printStackTrace();}CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();//创建post方式请求对象HttpPost httpPost = new HttpPost(url);// 请求头设置httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");httpPost.setHeader("SOAPAction", SOAPAction);// 情求体设置if (body != null) {httpPost.setEntity(new StringEntity(body, "utf-8"));}CloseableHttpResponse response = null;//执行请求操作,并拿到结果try {response = httpClient.execute(httpPost);//获取结果实体HttpEntity entity = response.getEntity();String respBody;if (entity != null) {respBody = EntityUtils.toString(entity);return respBody;}} catch (IOException e) {}return null;}

2. Http post

依赖:

        <!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- jodd-http --><dependency><groupId>org.jodd</groupId><artifactId>jodd-http</artifactId><version>6.3.0</version></dependency>

代码:

import lombok.extern.slf4j.Slf4j;
import jodd.http.*;public class HttpPostUtil {/*** http post 调用 WebService* @param wsUrl* @param jsonStr* @return*/public static String callServiceHP(String wsUrl, String jsonStr) {String xml = createSoapContent(jsonStr);String uploadFeeDetailJsonStr = postWs(wsUrl, xml);return uploadFeeDetailJsonStr;}/*** 根据拼接 xml 字符串* @param input* @return*/public static String createSoapContent(String jsonStr) {log.info("开始拼接请求报文");//开始拼接请求报文StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:zys=\"http://www.chenjy.com.cn/\">\n");stringBuilder.append("<soapenv:Header/>\n");stringBuilder.append("<soapenv:Body>\n");stringBuilder.append("<cjy:CallInterface>\n");stringBuilder.append("<cjy:msgHeader><![CDATA[\n");stringBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");stringBuilder.append("<root>\n");stringBuilder.append("<serverName>getInfo</serverName>\n");stringBuilder.append("<format>xml</format>\n");stringBuilder.append("<callOperator>测试</callOperator>\n");stringBuilder.append("<certificate>AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==</certificate>\n");stringBuilder.append("</root>\n");stringBuilder.append("]]></cjy:msgHeader>\n");stringBuilder.append("<cjy:msgBody><![CDATA[\n");stringBuilder.append( jsonStr+ "\n");stringBuilder.append("]]></cjy:msgBody>\n");stringBuilder.append("</cjy:CallInterface>\n");stringBuilder.append("</soapenv:Body>\n");stringBuilder.append("</soapenv:Envelope>");log.info("拼接后的参数"+stringBuilder.toString());return stringBuilder.toString();}/*** 调用 webService* @param url* @param jsonStr* @return*/public static String postWs(String url, String jsonStr) {HttpResponse resp = HttpRequest.post(url).connectionTimeout(60000).timeout(60000).contentType("application/xml", StandardCharsets.UTF_8.toString()).header("SOAPAction","").bodyText(jsonStr, "application/xml", "utf-8").charset(StandardCharsets.UTF_8.toString()).trustAllCerts(true).send();resp.charset(StandardCharsets.UTF_8.toString());return resp.bodyText();}
}

3. cxf

因为我用 cxf 调不通,所以就在这里就直接奉上其他博主的调用案例:
https://blog.csdn.net/qq_20161461/article/details/116237450

http://www.xdnf.cn/news/852823.html

相关文章:

  • MaxDOS v5.8s U盘版 / U盘版制作教程=(强力打造)
  • 【传奇服务器爱好者】-IGE引擎M2笔记-卧龙脚本
  • 传奇服务端Mirserver功能讲解
  • 毕业设计基于php玩酷(玩具)网站的设计与实现
  • coreplayer n79下载_coreplayer
  • 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
  • 广州华锐互动城市三维地图线上导航应用
  • new兼职网app v1.0.1
  • DeskScapes 8破解过期时间问题
  • android 市场 pad,91桌面Android Pad HD版发布 进军安卓平板市场
  • fckEditor的使用以及图片上传不显示解决
  • iPhone / iPad iOS 5.0.1完美 越狱 教程 A4/A5处理器
  • [2011-04-30]返现网排行榜
  • 热血江湖按键精灵游戏脚本!
  • 【转载】DC的逻辑综合与优化
  • 于娟的忠告----生命只有一次,活着才是王道啊!!!
  • Windows下的MS17-010(永恒之蓝)漏洞分析与复现
  • 10款精选的后台管理系统,收藏吧!
  • <网络>初识计算机网络
  • 测度定义_测度论整理(一)
  • 一套非常完整的机房装修方案
  • [内网渗透]内网基础知识
  • JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法
  • Html中Label标记的作用和使用介绍
  • 计算机软硬件介绍
  • JSP中 forward() 与redirect()的区别?
  • Aptana Studio 3的安装配置和使用教程
  • (转)25款实用的桌面版博客编辑器
  • Tomcat服务部署、虚拟主机配置及参数优化
  • VS2010 MSDN2010安装及使用(MSDN Library)