Java 调用 WebService 服务的 3 种方式

364.99° 2024-07-22 16:03:02 阅读 73

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

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

1. HttpClient

依赖:

<code> <!-- 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 = "";

// 创建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接口

<code> 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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。