快捷搜索:  汽车  科技

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)最后在message和type获取输入消息和返回消息所对应的具体数据结构。在获取上述几部分信息后,我们就可以利用Java的http服务,来模拟出交互的soap消息,代码如下:/** *利用httpclient进行soap访问 */ public static void httpClient() { try { CloseableHttpClient httpClient = HttpClients.createDefault(); // 1、设置webservice服务的服务地址 HttpPost httpPost = new HttpPost("http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWeb

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

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)(1)

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

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)(2)

首先从service元素中获取soap协议的服务地址(http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx);然后从该服务对应的binding元素中获取soapAction地址(http://webxml.com.cn/toSimplifiedChinese)。

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)(3)

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

wsdl哪一部分在soap中用(无框架纯JAVA进行WSDL文档SOAP协议调用)(4)

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

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

/** *利用httpclient进行soap访问 */ public static void httpClient() { try { CloseableHttpClient httpClient = HttpClients.createDefault(); // 1、设置webservice服务的服务地址 HttpPost httpPost = new HttpPost("http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx"); // 设置信息类型 httpPost.setHeader("Content-Type" "text/xml;charset=UTF-8"); // 2、在消息头部设置soapAction地址 httpPost.setHeader("SOAPAction" "http://webxml.com.cn/toSimplifiedChinese"); // 3、构造soap消息主体 String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " "xmlns:web=\"http://webxml.com.cn/\">" // 设置头 "<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" "http://webxml.com.cn/"); 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包如下所示:

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

猜您喜欢: