第0章:简介
简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。webService三要素:SOAP、WSDL (Web Services Description Language)、UDDI( Universal Description Discovery and Integration )之一, soap用来传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService 具体实现可以搜索 Web Services简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。(来源:百度百科)
第0节:SOAP消息格式
<
SOAP-ENV:
Envelope
各种属性>
<!--示例-->
<
SOAP:HEADER
>
</
SOAP:HEADER
>
<
SOAP:Body
>
</
SOAP:Body
>
</
SOAP-ENV:Envelope
>
|
构建模块
-
必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
-
可选的 Header 元素,包含头部信息
-
必需的 Body 元素,包含所有的调用和响应信息
-
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
语法规则
-
SOAP 消息必须用 XML 来编码
-
SOAP 消息必须使用 SOAP Envelope 命名空间
-
SOAP 消息必须使用 SOAP Encoding 命名空间
-
SOAP 消息不能包含 DTD 引用
-
SOAP 消息不能包含 XML 处理指令
例如:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://dataquery.menergy.com"> <soapenv:Header/> <soapenv:Body> <dat:GetMsg> <!--Optional:--> <dat:req> <!--Optional:--> <dat:id>123</dat:id> <!--Optional:--> <dat:type>123</dat:type> <!--Optional:--> <dat:protocol>123</dat:protocol> <!--Optional:--> <dat:date>20140224</dat:date> <!--Optional:--> <dat:cursor>?</dat:cursor> <!--Optional:--> <dat:pagesize>?</dat:pagesize> <!--Optional:--> <dat:format>34</dat:format> </dat:req> </dat:GetMsg> </soapenv:Body> </soapenv:Envelope> |
第1节:soapui工具
soapui官网:http://www.soapui.org/
开源中国:http://www.oschina.net/p/soapui/
使用博客:http://blog.csdn.net/hailangamy/article/details/6957355
第2节:札记
第1章:实践
HTTP协议调用SOAP处理类(SoapClientHandler.java):
package com.mcc.core.net;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 使用HTTP协议调用SOAP处理类
*
* @author <a href="mailto:417877417@qq.com">menergy</a>
* DateTime: 14-2-24 下午2:27
*/
public class SoapClientHandler {
/**
* 通过HTTP请求方式调用WebSe
*
* @param soapUrl SOAP的URL,包括wsdl段
* @param soapRequest SOAP的请求
* @return
*/
public static String request(String soapUrl, String soapRequest,String soapAction) {
String actual = "";
HttpURLConnection connection = null;
OutputStream os = null;
PrintWriter out = null;
InputStream is = null;
BufferedReader br = null;
try {
URL url = new URL(soapUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
// 处理请求参数
os = connection.getOutputStream();
out = new PrintWriter(os);
out.println(soapRequest);
// 发送请求
out.flush();
// http status ok
if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
System.out.println("HTTP_OK");
}
// 处理返回信息
is = connection.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
for (String line = br.readLine(); line != null; line = br.readLine()) {
builder.append(line);
}
actual = builder.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
if (br != null) {
br.close();
}
if (out != null) {
out.close();
}
if (connection != null) {
connection.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return actual;
}
public static void main(String args[]){
//webservice服务路径,一般为wsdl后缀
String serviceUrl = "http://192.168.1.100:8181?wsdl";
StringBuilder request = new StringBuilder();
//下面格式可以从soapui客户端工具获得
request.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:dat=\"http://dataquery.menergy.com\">");
request.append("<soapenv:Header/><soapenv:Body>");
request.append("<dat:GetInfo><dat:req>");
request.append("<dat:id>123</dat:id>");
request.append("<dat:type>123</dat:type>");
request.append("<dat:protocol>123</dat:protocol>");
request.append("<dat:date>20140224</dat:date>");
request.append("<dat:cursor></dat:cursor>");
request.append("<dat:pagesize></dat:pagesize>");
request.append("<dat:format>34</dat:format>");
request.append(" </dat:req></dat:GetInfo>");
request.append("</soapenv:Body></soapenv:Envelope>");
// 组装SOAP请求的参数
String soapRequest = request.toString();
// SOAP ACTION ,对应xmlns命名空间方法路径
String soapAction = "http://dataquery.menergy.com/GetInfo";
// 使用HTTP协议调用SOAP的数据
String response = SoapClientHandler.request(serviceUrl, soapRequest, soapAction);
//web service 返回结果
System.out.println("响应结果:\n" + response);
}
}