------------恢复内容开始------------
1.soap简介
soap是用于应用程序间的数据通讯服务,具有跨语言和跨平台的特点,是w3c的推荐标准之一,相比http,具有一定的安全性特点;
可以理解为是基于xml(可扩展标记语言)的http,soap=http+xml;
soap请求实例:
通过这个 http://www.thuwater.com/dataservice/datafetch.asmx;
调用地址进行一些服务方法的获取。
以GetPlaceList方法为例,参照soap协议内容进行服务请求;
占位符需替换为实际值。
1 POST /dataservice/datafetch.asmx HTTP/1.1
2 Host: 47.105.193.134
3 Content-Type: text/xml; charset=utf-8
4 Content-Length: length
5 SOAPAction: "http://tempuri.org/GetPlaceList"
6
7 <?xml version="1.0" encoding="utf-8"?>
8 <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
9 <soap:Body>
10 <GetPlaceList xmlns="http://tempuri.org/">
11 <userName>string</userName>
12 <passwd>string</passwd>
13 </GetPlaceList>
14 </soap:Body>
15 </soap:Envelope>
16 HTTP/1.1 200 OK
17 Content-Type: text/xml; charset=utf-8
18 Content-Length: length
19
20 <?xml version="1.0" encoding="utf-8"?>
21 <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
22 <soap:Body>
23 <GetPlaceListResponse xmlns="http://tempuri.org/">
24 <GetPlaceListResult>string</GetPlaceListResult>
25 </GetPlaceListResponse>
26 </soap:Body>
27 </soap:Envelope>
以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。相比于SOAP1.1,请求中没有SOAPAction: "http://tempuri.org/GetPlaceList";
1 POST /dataservice/datafetch.asmx HTTP/1.1
2 Host: 47.105.193.134
3 Content-Type: application/soap+xml; charset=utf-8
4 Content-Length: length
5
6 <?xml version="1.0" encoding="utf-8"?>
7 <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
8 <soap12:Body>
9 <GetPlaceList xmlns="http://tempuri.org/">
10 <userName>string</userName>
11 <passwd>string</passwd>
12 </GetPlaceList>
13 </soap12:Body>
14 </soap12:Envelope>
15 HTTP/1.1 200 OK
16 Content-Type: application/soap+xml; charset=utf-8
17 Content-Length: length
18
19 <?xml version="1.0" encoding="utf-8"?>
20 <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
21 <soap12:Body>
22 <GetPlaceListResponse xmlns="http://tempuri.org/">
23 <GetPlaceListResult>string</GetPlaceListResult>
24 </GetPlaceListResponse>
25 </soap12:Body>
26 </soap12:Envelope>
利用soap进行数请求方法如下;
1 public static string GetSOAPSourc()
2 {
3 string result = "";
4 string responseString = "";
5 string requestBody =
6 @"<?xml version=""1.0"" encoding=""utf - 8""?>
7 <soap12:Envelope xmlns:xsi =""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd =""http://www.w3.org/2001/XMLSchema"" xmlns:soap12 =""http://www.w3.org/2003/05/soap-envelope"" >
8 <soap12:Body>
9 <GetPlaceList xmlns =""http://tempuri.org/"">
10 <userName>name</userName>
11 <passwd>passwd</passwd >
12 </GetPlaceList>
13 </soap12:Body>
14 </soap12:Envelope>";
15 byte[] postBytes = Encoding.UTF8.GetBytes(requestBody);
16 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.thuwater.com/dataservice/datafetch.asmx");
17 req.Method = "POST";
18 req.ContentType = "text/xml;charset=utf-8";
19 req.ContentLength = postBytes.Length;
20 using (Stream reqStream = req.GetRequestStream())
21 {
22 reqStream.Write(postBytes, 0, postBytes.Length);
23 }
24 using (HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse())
25 {
26 StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
27 responseString = sr.ReadToEnd();
28 try
29 {
30 XmlDocument doc = new XmlDocument();//新建对象
31 doc.LoadXml(responseString);//符合xml格式的字符串
32 dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(doc.InnerText);
33 string[] equipIds = new string[0];
34 var equipIdList=equipIds.ToList();
35 for (int i = 0; i < obj.Value.Count; i++) {
36 equipIdList.Add(Convert.ToString(obj.Value[i].EquipID));
37 }
38 Console.WriteLine();
39
40 }
41 catch (Exception e)
42 {
43
44 return null;
45 }
46
47 }
48 return result;
49
50 }
说明:soap请求中,Content-Type 和ContentLength是必须的;请求的url地址就是获取方法说明的地址;如果利用soap1.2,可以省略请求头部的SOAPAction参数;返回的数据内容,即是前面示例中的相应内容;
2.带有命名空间的xml元素标签解析
命名空间就是为了区分相同元素标签而添加的标识,一般是数据来源或者标准;
1 <root>
3 <h:table xmlns:h="http://www.w3.org/TR/html4/">
4 <h:tr>
5 <h:td>Apples</h:td>
6 <h:td>Bananas</h:td>
7 </h:tr>
8 </h:table>
9
10 <f:table xmlns:f="http://www.w3cschool.cc/furniture">
11 <f:name>African Coffee Table</f:name>
12 <f:width>80</f:width>
13 <f:length>120</f:length>
14 </f:table>
15
16 </root>
还有以下默认的命名空间:
1 <table xmlns="http://www.w3.org/TR/html4/">
2 <tr>
3 <td>Apples</td>
4 <td>Bananas</td>
5 </tr>
6 </table>
获取的数据为xml字符串,需要转为xml对象,需要进行解析;
1 public static void test() {
2 //具有命名空间前缀的数据
3 string testStr =
4 @"<?xml version=""1.0"" encoding=""utf - 8""?>
5 <soap12:Envelope xmlns:xsi =""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd =""http://www.w3.org/2001/XMLSchema"" xmlns:soap12 =""http://www.w3.org/2003/05/soap-envelope"" >
6 <soap12:Body>
7 <GetPlaceList xmlns =""http://tempuri.org/"">
8 <userName>string</userName>
9 </GetPlaceList>
10 </soap12:Body>
11 </soap12:Envelope>";
12 //普通xml数据
13 string testStr1 =
14 @"<?xml version=""1.0"" encoding=""utf - 8""?>
15 <Envelope>
16 <Body>
17 <GetPlaceList>
18 <userName>data20190070</userName>
19 <passwd>data20190070@0108</passwd >
20 </GetPlaceList>
21 </Body>
22 </Envelope>";
23
24 XmlDocument doc = new XmlDocument();//新建对象
25 doc.LoadXml(testStr);//符合xml格式的字符串
26 XmlNamespaceManager nsp = new XmlNamespaceManager(doc.NameTable);//添加默认命名空间名称
27 nsp.AddNamespace("soap12", "http://www.w3.org/2003/05/soap-envelope");//添加用到的命名空间
28 nsp.AddNamespace(string.Empty, "http://tempuri.org/");//默认的可以用string.Empty添加
29 XmlNode root = doc.DocumentElement;//找到根节点,这root就是soap12:Envelope节点了,下面的请求路径不用再添加soap12:Envelope
30 string nodeString = "soap12:Body/GetPlaceList";//读取节点路径;这里GetPlaceList节点读取不到,是有问题,还在探索中。。。
31 XmlNodeList nodeList = root.SelectNodes(nodeString, nsp);//读取节点(从root开始读,不是从doc;如果从doc,要加上soap12:Envelope/),如果是有命名空间前缀的,需要添加命名空间
32
33
34
35 XmlDocument doc1 = new XmlDocument();//新建对象
36 doc1.LoadXml(testStr1);//符合xml格式的字符串
37 string nodeString1 = "soap12:Envelope/soap12:Body/GetPlaceList";//读取节点路径;这里GetPlaceList节点读取不到,是有问题,还在探索中。。。
38 XmlNodeList nodeList1 = doc1.SelectNodes(nodeString1);//读取节点,如果是有命名空间前缀的,需要添加命名空间;这里直接从doc开始读
39
40 Console.WriteLine();
41
42 }
及时整理;慢慢积累;
------------恢复内容结束------------