Java 调用 WebService 服务的 3 种方式

Java 调用 WebService 服务的 3 种方式

码农世界 2024-02-23 后端 104 次浏览 0个评论

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

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

1. HttpClient

依赖:

        
        
            org.projectlombok
            lombok
            true
        
        
        
            org.apache.httpcomponents.client5
            httpclient5
            5.1.3
        

代码:

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("\n");
        stringBuilder.append("\n");
        stringBuilder.append("\n");
        stringBuilder.append("\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("\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 = "";
        // 创建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

依赖:

        
        
            org.projectlombok
            lombok
            true
        
        
        
            org.jodd
            jodd-http
            6.3.0
        

代码:

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("\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("\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

转载请注明来自码农世界,本文标题:《Java 调用 WebService 服务的 3 种方式》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,104人围观)参与讨论

还没有评论,来说两句吧...

Top