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

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

1. HttpClient

依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><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;@Slf4jpublic 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("\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("<![CDATA[\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("getInfo\n");stringBuilder.append("xml\n");stringBuilder.append("测试\n");stringBuilder.append("AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==\n");stringBuilder.append("\n");stringBuilder.append("]]>\n");stringBuilder.append("<![CDATA[\n");stringBuilder.append( jsonStr+ "\n");stringBuilder.append("]]>\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("");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

依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><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("\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("<![CDATA[\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("getInfo\n");stringBuilder.append("xml\n");stringBuilder.append("测试\n");stringBuilder.append("AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==\n");stringBuilder.append("\n");stringBuilder.append("]]>\n");stringBuilder.append("<![CDATA[\n");stringBuilder.append( jsonStr+ "\n");stringBuilder.append("]]>\n");stringBuilder.append("\n");stringBuilder.append("\n");stringBuilder.append("");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