/** WebServcie 概念
多个系统数据交换: 跨平台语言的相互通信;
如:java 的客户端 和dotnet的服务器端的接口调用:
得到接口和方法 : 基于标准的协议,可编程语言; 服务器开发 api;
特点:
自包含:只要客户端支持http和xml就可以;
自描述:只需要知道请求响应的类型; 其他的不需要考虑
跨平台:不同语言可以相互通信。
通过网络:发布查找使用;
松耦合;
术语:
XML:扩展型可标记语言;
SOAP:简单对象访问协议;用来描述传递信息的格式; xml方法的调用规范;支持http等协议
WSDL:web描述性语言,xml文档,自动生成;; 说明一组soap消息,和如何交互消息,是软件自动生成的xml文档;
UDDI:英文为 "Universal Description, Discovery and Integration"通用描述、发现与集成服务; 引导系统查找响应服务的机制;
根据描述文档,来引导系统查找响应服务的机制。 提供自出服务,其他厂商根据服务;
【公司的举例:】
soap 协议、合同,约束双方
wsdl 说明书,提供什么服务
uddi 工商注册,方便别人查询
*/
/* wsdl
wsdl 文档包含
详细学习:http://www.w3school.com.cn/wsdl/wsdl_documents.asp
某种类型系统:
WSDL 文档是利用这些主要的元素来描述某个 web service
元素 定义
web service 执行的操作
web service 使用的消息
web service 使用的数据类型
web service 使用的通信协议
*/
/* soap
简单对象的访问协议;
基于xml协议,以xml形式提供了一个简单的数据交换的协议;
访问web服务的简单对象的访问协议
通过http实现信息传递
1)soap封装:描述消息中的内容;
2)soap编码规则:定义序列化的机制、应用程序类型实例;
3)soap rpc : 远程应答的协议 远程过程调用
4)soap绑定: 节点间交互 soap的封装
格式如:
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"
string
规则:
需要使用xml编码
是必须的
Type传输数据类型
soap:Envelope 必须使用命名空间
优点:1)可扩展;2)简单的;3)和厂商无关;4)编程语言无关;
*/
//***********【soap1.1 解析的过程】**************
/**
soap 1.1 xmlpull conn URL
1.代码和注解
2.xml文件
*/
/** 2016年9月 整理webService的解析 (单词以外的链接有问题)
* WebService POST 请求 Soap1.1协议、 xml解析
*
* @see 单词翻译查询网址:
* @see 1.网址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
* @see 2.选方法: Translator 查询单词
* @see 3.方法中看soap协议,1.1或者1.2。对应post 中,xml部分复制,在asset中建立xml文件保存。
* @see 4.修改xml中 ,参数部分,如:string 。其中string修改为
* #word,方便后续代码替换
* @see 步骤
* @see 1、xml参数转 流,替换单词参数, 并创建HttpURLConnection链接
* @see 2、conn设置链接的 协议,参考 soap文件 conn.setRequestProperty("Content-Type",
* "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
* @see 3、os 输出流 写 刷新
* @see 4、输入流 并 xml解析
*
*
* @throws IOException
* @throws XmlPullParserException
*/
public void WspostSoap11() throws IOException, XmlPullParserException {
/*
* ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
*/
String path = "word.xml";
InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
InputStreamReader reader = new InputStreamReader(is, "utf-8");
BufferedReader bfReader = new BufferedReader(reader);
String str = "";
StringBuilder sb = new StringBuilder();
while ((str = bfReader.readLine()) != null) {
// str += str.replace("#word", "girl");
sb.append(str.replace("#word", "girl"));
}
byte[] data = sb.toString().getBytes();
String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
URL urls = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setReadTimeout(3 * 1000);
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("Content-Length", data.length + "");
conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(data, 0, data.length);
os.flush();
InputStream isRusult = conn.getInputStream();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(isRusult, "utf-8");
String result = "";
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
result = parser.nextText();
}
if ("Trans".equals(parser.getName())) {
Log.e(TAG, " Trans " + parser.toString());
}
parser.next();
}
Log.e(TAG, " result " + result);
}
//=====================word.xml
#word
//=====================参考的 SOAP 1.1
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"
string
//***********【soap1.2 解析的过程】**************
/**
* WebService POST 请求 Soap1.2协议、 xml解析
*
* @see 单词翻译查询网址:
* @see 1.网址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
* @see 2.选方法: Translator 查询单词
* @see 3.方法中看soap协议,1.1或者1.2。对应post 中,xml部分复制,在asset中建立xml文件保存。
* @see 4.修改xml中 ,参数部分,如:string 。其中string修改为
* #word,方便后续代码替换
* @see 步骤
* @see 1、xml参数转 流,替换单词参数, 并创建HttpURLConnection链接
* @see 2、conn设置链接的 协议,参考 soap文件 conn.setRequestProperty("Content-Type",
* "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
* @see 3、os 输出流 写 刷新
* @see 4、输入流 并 xml解析
*
* @category soap 1.1 与 1.2 不同地方两个:
* 1、setRequestProperty 1.2 设置协议中没有 SOAPAction
* 2、1.2 协议的 xml文件不太一样。
* @throws IOException
* @throws XmlPullParserException
*/
public void WspostSoap12() throws IOException, XmlPullParserException {
/*
* ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
*/
String path = "word12.xml";
InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
InputStreamReader reader = new InputStreamReader(is, "utf-8");
BufferedReader bfReader = new BufferedReader(reader);
String str = "";
StringBuilder sb = new StringBuilder();
while ((str = bfReader.readLine()) != null) {
sb.append(str.replace("#word", "boy"));
}
byte[] data = sb.toString().getBytes();
String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
URL urls = new URL(url);
HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setReadTimeout(3 * 1000);
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
conn.setRequestProperty("Content-Length", data.length + "");
// conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
os.write(data, 0, data.length);
os.flush();
InputStream isRusult = conn.getInputStream();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(isRusult, "utf-8");
String result = "";
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
result = parser.nextText();
}
if ("Trans".equals(parser.getName())) {
Log.e(TAG, " Trans " + parser.getName());
}
parser.next();
}
Log.e(TAG, " result " + result);
}
//**********【使用jar包的解析方法soap】**********************
/**
* soap 解析
*
* @see 1.导包 ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
* @see 2.定义网址、方法、命名空间
* @see 3.HttpTransportSE soap请求对象
* @see 4.SoapSerializationEnvelope soap序列化后的封装对象: soap信封
* @see 5.SoapObject 参数对象 并设置 addProperty
* @see 6.htse 调用 call方法 client.call(namespace + method, envelope);
* @see 7.信封中 查看响应 envelope.getResponse,返回bodyIn信息:字符串替换查找
*
*/
public void soapDictionaryWord() {
try {
// 要访问的网址
String wsdl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
// webservice 的功能名称
String method = "Translator";
// 响应数据的namespace
String namespace = "http://WebXml.com.cn/";
// soap客户端 http传输协议对象 send envelope
HttpTransportSE client = new HttpTransportSE(wsdl);
// soap序列化后的封装对象: soap信封
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// 参数对象 目标
SoapObject params = new SoapObject(namespace, method);
// 添加要翻译的单词 添加属性
params.addProperty("wordKey", "Everybody");
// 设置参数对象 放入信封
envelope.bodyOut = params;
// 设置支持dotNet 服务器
envelope.dotNet = true;
// 访问webService 1.设置所需的SOAPAction头字段 2.包含soap调用信息的信封
client.call(namespace + method, envelope);
// 有响应结果 ; api 从包装对象中拉取一个对象,并返回,不为空表示得到了对象
if (envelope.getResponse() != null) {
// 返回响应对象 接收信封中的内容
SoapObject response = (SoapObject) envelope.bodyIn;
// 处理响应数据 : 返回指定位置的特定属性 0;得到body中的内容
SoapObject obj = (SoapObject) response.getProperty(0);
System.out.println("------" + obj);
// 获取响应的字符串
String result = obj.toString();
// 找截断的起始位置
int firstIndex = result.indexOf("Translation=");
// 找截断的终止位置
int endIndex = result.indexOf(";", firstIndex);
// 翻译后的字符串
String transWord = result.substring(firstIndex + "Translation=".length(), endIndex);
System.out.println("------" + transWord);
System.out.println("------" + getResult(result, "Trans=别", "。"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//测试解析字符串的方法
public String getResult(String resu, String starStr, String endStr) {
int first = resu.indexOf(starStr);
int end = resu.indexOf("。", first);
return resu.substring(first + starStr.length() - 1, end);
}