Java 调用 WebService 服务的 3 种方式

作者 : admin 本文共5774个字,预计阅读时间需要15分钟 发布时间: 2024-06-10 共2人阅读

虽然 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;
@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("
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("<![CDATA[
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("getInfo
");
stringBuilder.append("xml
");
stringBuilder.append("测试
");
stringBuilder.append("AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==
");
stringBuilder.append("
");
stringBuilder.append("]]>
");
stringBuilder.append("<![CDATA[
");
stringBuilder.append( jsonStr+ "
");
stringBuilder.append("]]>
");
stringBuilder.append("
");
stringBuilder.append("
");
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 = "";
// 创建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 获取到入参,如下:
Java 调用 WebService 服务的 3 种方式插图
把这些参数全部拼接进去:
Java 调用 WebService 服务的 3 种方式插图(1)

补充:忽略 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

依赖:

        
<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("
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("<![CDATA[
");
stringBuilder.append("
");
stringBuilder.append("
");
stringBuilder.append("getInfo
");
stringBuilder.append("xml
");
stringBuilder.append("测试
");
stringBuilder.append("AcsaoP21Lxw5KAoQu6SLs624bhGjwNL0DzxsQ9a7B/HbqNsPPcA==
");
stringBuilder.append("
");
stringBuilder.append("]]>
");
stringBuilder.append("<![CDATA[
");
stringBuilder.append( jsonStr+ "
");
stringBuilder.append("]]>
");
stringBuilder.append("
");
stringBuilder.append("
");
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 调不通,所以就在这里就直接奉上其他博主的调用案例:
http://blog.csdn.net/qq_20161461/article/details/116237450

本站无任何商业行为
个人在线分享 » Java 调用 WebService 服务的 3 种方式
E-->