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文件中各个元素所代表的含义,在此文档不在重复叙述,如果感兴趣的话,可以看上一篇文档,对WSDL各元素进行了描述。在看到上面这个文档,我们不用全部都看,建议大家从后往前看,以此获取接口的服务地址、SOAPACTION地址(包括接口名称)、接口参数等信息,如下图所示:
首先从service元素中获取soap协议的服务地址(http://www.webxml.com.cn/WebServices/TraditionalSimplifiedWebService.asmx);然后从该服务对应的binding元素中获取soapAction地址(http://webxml.com.cn/toSimplifiedChinese)。
然后在对应的portType元素中获取输入的消息和返回的消息名称。
最后在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>