您的位置 首页 java

无框架纯JAVA进行WSDL文档SOAP协议调用

WebService 服务能够使运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。通常WebService通过WSDL文件对外公布开发接口的地址、协议、数据类型。但是由于WSDL文档相对复杂,如果不能很好理解各个元素代表的含义,就无从开发相应的交互接口,来对WebService服务进行调用,下面将以开放的中文简体字与繁体字转换WebSeivice服务接口为例,讲解一下利用 Java 根据WSDL文件发送SOAP结构文件来进行数据交互。其WebService服务地址为。打开该链接后,将会得到如下图所示的WSDL文件,如下图所示:

无框架纯JAVA进行WSDL文档SOAP协议调用

对于WSDL文件中各个元素所代表的含义,在此文档不在重复叙述,如果感兴趣的话,可以看上一篇文档,对WSDL各元素进行了描述。在看到上面这个文档,我们不用全部都看,建议大家从后往前看,以此获取接口的服务地址、SOAPACTION地址(包括接口名称)、接口参数等信息,如下图所示:

无框架纯JAVA进行WSDL文档SOAP协议调用

首先从service元素中获取soap协议的服务地址();然后从该服务对应的binding元素中获取soapAction地址()。

无框架纯JAVA进行WSDL文档SOAP协议调用

然后在对应的portType元素中获取输入的消息和返回的消息名称。

最后在 message 和type获取输入消息和返回消息所对应的具体数据结构。

在获取上述几部分信息后,我们就可以利用Java的http服务,来模拟出交互的soap消息,代码如下:

 /**
     *利用 httpclient 进行soap访问
     */
    public static void httpClient() {
        try {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            // 1、设置webservice服务的服务地址
            HttpPost httpPost = new HttpPost("#34;);
            // 设置信息类型
            httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");
            // 2、在消息头部设置soapAction地址
            httpPost.setHeader("SOAPAction", "#34;);
            // 3、构造soap消息主体
            String soap = "<soapenv:Envelope xmlns:soapenv="#34; " +
                    "xmlns:web="#34;>"      // 设置头
                    + "<soapenv:Header/>"
                    + "<soapenv:Body>"
                    +    "<web:toSimplifiedChinese>"      // 设置消息名称
                    +      "<web:sText>中國</web:sText>"   // 设置该接口需要传入的具体参数
                    +    "</web:toSimplifiedChinese>"
                    + "</soapenv:Body>"
                    + "</soapenv:Envelope>";
            // 转化成字符流
            InputStreamEntity entity = new InputStreamEntity(new ByteArrayInputStream(soap.getBytes()));
            httpPost.setEntity(entity);
            // 4、发送请求
            CloseableHttpResponse response = httpClient.execute(httpPost);
            // 判断消息发送是否成功
            if (response.getStatusLine().getStatusCode() == org. apache .http.HttpStatus.SC_OK) {
                // 5、获取返回结果
                HttpEntity responseEntity = response.getEntity();
                // 将返回流变成字符流
                String  back  = EntityUtils.toString(responseEntity);
                System.out.println("httpClient返回soap:" + back);
                // 6、解析结果字符串
                String result = "";
                try {
                     reader   file  = new StringReader(back);
                    SAXReader reader = new SAXReader();
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("ns", "#34;);
                    reader.getDocumentFactory().setXPathNamespaceURIs(map);
                    Document dc = reader.read(file);
                    // 获取结果
                    result = dc.selectSingleNode("//ns:toSimplifiedChineseResult").getText().trim();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("httpClient返回结果:" + result);
            } else {
                System.out.println("HttpClinet返回状态码:" + response.getStatusLine().getStatusCode());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  

从上面的代码可以看出,代码主要包含6部分内容,其中第3部分构造soap消息主体中的设置接口名称,该部分内容与message中的内容一致,同时该代码利用maven来进行jar包注入,其依赖的jar包如下所示:

 <!--  -->
        <!-- http请求客户端 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.10</version>
        </dependency>
        <!--  -->
        <!-- 解析xml -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <!--  -->
        <!-- dom4j的依赖 -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>  

文章来源:智云一二三科技

文章标题:无框架纯JAVA进行WSDL文档SOAP协议调用

文章地址:https://www.zhihuclub.com/174801.shtml

关于作者: 智云科技

热门文章

网站地图