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

Java 调用 WebService 服务的 3 种方式

27 人参与  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://m.zhangshiyu.com/post/93474.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

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

最新文章

  • 救助身价六十万的流浪狗后,室友疯了虐心反转_娜娜张琳爱犬后续更新+番外_小说后续在线阅读_无删减免费完结_
  • 送走老公的白月光,我转身嫁给了死对头完整文本_恩泽维生素薛泽恩免费看_小说后续在线阅读_无删减免费完结_
  • 所爱已隔人山人海看点十足(温掬月周既明)全书浏览_所爱已隔人山人海看点十足全书浏览
  • 犹若清风梦了云小说(叶知薇晏临渊)外篇+结局(犹若清风梦了云)全篇在线阅读
  • 我转岗做文员后,自称尸语者的男友小青梅急了全书+后续高分言情(江晚晴陆景行)
  • 我转岗做文员后,自称尸语者的男友小青梅急了全书+后续列表_我转岗做文员后,自称尸语者的男友小青梅急了全书+后续(江晚晴陆景行)
  • 风止于海,月沉于你快手热门_霍铮静姝宋昭昭阅读_小说后续在线阅读_无删减免费完结_
  • 在猎金游戏里和别人绑定生死后,男友悔哭了优质全文_沈英韶李倩陆北深精修版_小说后续在线阅读_无删减免费完结_
  • 我转岗做文员后,自称尸语者的男友小青梅急了江晚晴陆景行完本_我转岗做文员后,自称尸语者的男友小青梅急了(江晚晴陆景行)
  • 前传苏小朵卫献知续集:全文+番外穿成炮灰原配,首长白天总拉窗帘:结局+番外新上热文
  • 犹若清风梦了云列表_犹若清风梦了云(晏临渊叶知薇谢执玉)
  • 春风不渡无心人结局+完结(林至南霍以峦)_春风不渡无心人结局+完结(林至南霍以峦)

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

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