虽然 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;@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("<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 = ""; // 创建HttpClientBuilder HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); // HttpClient CloseableHttpClient 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() { @Override public 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