Java调用WebService服务的三种方式总结

 更新时间:2023年08月24日 10:42:05   作者:364.99°  
虽然WebService这个框架已经过时,但是有些公司还在使用,在调用他们的服务的时候就不得不面对各种问题,本篇文章总结了最近我调用 WebService的心路历程,3种方式可以分别尝试,需要的朋友可以参考下

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;
@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 获取到入参,如下:

把这些参数全部拼接进去:

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

Java使用cxf发布及调用webservice接口的方法详解_java_脚本之家 (jb51.net)

到此这篇关于Java调用WebService服务的三种方式分享的文章就介绍到这了,更多相关Java调用WebService服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程 volatile关键字详解

    Java多线程 volatile关键字详解

    这篇文章主要介绍了Java多线程 volatile关键字详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • JAVA验证码工具实例代码

    JAVA验证码工具实例代码

    这篇文章主要介绍了JAVA验证码工具实例代码,需要的朋友可以参考下
    2018-03-03
  • 关于Idea卡在Resolving Maven dependencies的解决方案

    关于Idea卡在Resolving Maven dependencies的解决方案

    本文详细介绍了关于Idea卡在Resolving Maven dependencies的解决方案,文中通过图文结合的形式给大家介绍的非常详细,对大家解决问题有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • mybatis-parameterType传入map条件方式

    mybatis-parameterType传入map条件方式

    这篇文章主要介绍了mybatis-parameterType传入map条件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java之minio文件服务器的日常操作

    java之minio文件服务器的日常操作

    本文介绍如何在Java项目中配置Minio服务,通过创建minioConfig和minioDto来管理连接信息,并通过minioUtils工具类实现文件的上传、下载和删除功能,详细说明了如何从application.yml文件中读取配置,并强调了避免static情况下minioDto为null的问题,另外,提到删除操作是延迟的
    2024-10-10
  • SpringBoot预防XSS攻击的实现

    SpringBoot预防XSS攻击的实现

    XSS攻击是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面,本文主要介绍了SpringBoot预防XSS攻击的实现,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot中的RabbitMQ用法详解

    SpringBoot中的RabbitMQ用法详解

    RabbitMQ是一个开源的消息队列系统,它通过AMQP(高级消息队列协议)来实现消息的传递,SpringBoot是目前非常流行的Java开发框架,它提供了很多便利性的功能,其中就包括对RabbitMQ的支持,在本文中,我们将介绍如何在SpringBoot中使用RabbitMQ
    2023-07-07
  • 在SpringBoot框架下实现Excel导入导出的方法详解

    在SpringBoot框架下实现Excel导入导出的方法详解

    SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,今天我们就使用纯前对按表格控件带大家了解,如何在Spring Boot框架下实现Excel服务端导入导出,需要的朋友可以参考下
    2023-06-06
  • SpringBoot如何使用applicationContext.xml配置文件

    SpringBoot如何使用applicationContext.xml配置文件

    这篇文章主要介绍了SpringBoot使用applicationContext.xml配置文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 教你1秒将本地SpringBoot项目jar包部署到Linux环境(超详细!)

    教你1秒将本地SpringBoot项目jar包部署到Linux环境(超详细!)

    spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配置,下面这篇文章主要给大家介绍了关于1秒将本地SpringBoot项目jar包部署到Linux环境的相关资料,超级详细,需要的朋友可以参考下
    2023-04-04

最新评论