当前位置:首页 » 《我的小黑屋》 » 正文

Java 调用 WebService 服务的 3 种方式

3 人参与  2024年04月10日 16:09  分类 : 《我的小黑屋》  评论

点击全文阅读


虽然 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


点击全文阅读


本文链接:http://zhangshiyu.com/post/93474.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1