首先了解兩點知識,1.什麼時webserve,2.什麼是soap
1.WebService是一個SOA(面向服務的編程)的架構,它是不依賴於語言,不依賴於平臺,可以實現不同的語言間的相互調用,通過Internet進行基於Http協議的網絡應用間的交互。 WebService實現不同語言間的調用,是依託於一個標準,webservice是需要遵守WSDL(web服務定義語言)/SOAP(簡單請求協議)規範的。 WebService=WSDL+SOAP+UDDI(webservice的註冊)。WebServices 提供一個建立分佈式應用的平臺。
2.SOAP 是基於 XML 的簡易協議,可使應用程序在 HTTP 之上進行信息交換。或者更簡單地說:SOAP 是用於訪問網絡服務的協議,基於 XML。SOAP 是一種用於發送消息的格式。
第一步:調通接口
在對接之前保證接口的是能調通的,我使用了PostMan和SoapUI進行調試。SoapUI是可以調通的,PostMan一開始調不通報了500的錯誤,後來發先是Headers沒有寫SoapAction。SoapAction的值在SoapUI中可以看到。
第二步發送請求
現在知道有兩種方法,第一種直接封裝信封,使用WebRequest。代碼如下:
public static string GetWebSock()
{
StringBuilder soap = new StringBuilder();
soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:jet=\"http://jjj\" xmlns:jet1=\"http://jjj1/2004/07/jjj.DataModel.Cis\" xmlns:jet2=\"http://jjj2/2004/07/jjj.DataModel.DXS\">");
soap.Append("<soapenv:Header/>");
soap.Append("<soapenv:Body>");
soap.Append("<jet:QueryEncounter>");
soap.Append("<jet:param>");
soap.Append("<jet1:Provider></jet1:Provider>");
soap.Append("<jet2:AdmitDateOn>2019-12-30</jet2:AdmitDateOn>");
soap.Append("<jet2:EncounterKindCode>0</jet2:EncounterKindCode>");
soap.Append("<jet2:IPSeqNoText>79</jet2:IPSeqNoText>");
soap.Append("</jet:param>");
soap.Append("</jet:QueryEncounter>");
soap.Append("</soapenv:Body>");
soap.Append("</soapenv:Envelope>");
//發起請求
Uri uri = new Uri("http://xxx/ESBService/Query.svc");
string a = "";
try
{
WebRequest webRequest = WebRequest.Create(uri);
webRequest.ContentType = "text/xml; charset=UTF-8";
webRequest.Method = "POST";
webRequest.Headers.Add("SOAPAction", "http://jjj/IQuerySvc/QueryEncounter");
using (Stream requestStream = webRequest.GetRequestStream())
{
byte[] paramBytes = Encoding.UTF8.GetBytes(soap.ToString());
requestStream.Write(paramBytes, 0, paramBytes.Length);
}
//響應
WebResponse webResponse = webRequest.GetResponse();
using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
//Console.WriteLine(myStreamReader.ReadToEnd());
a += myStreamReader.ReadToEnd();
}
XmlDocument doc = new XmlDocument();
doc.LoadXml(a);
//解析方法
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
//此處是soap1.1如下:
mgr.AddNamespace("s", "http://jjjj/soap/envelope/");
mgr.AddNamespace("a", "http://jjjj/2004/07/JetSun.DataModel.DXS");
mgr.AddNamespace("i", "http://jjjj/2001/XMLSchema-instance");
mgr.AddNamespace("z", "http://jjjj/2003/10/Serialization/");
var rootNode = doc.SelectNodes("//a:QueryEncounter_Result/*", mgr);
string name = "";
foreach (XmlNode xxNode in rootNode)
{
string dsf = xxNode.InnerText;
string sdf = xxNode.Name;
//name += "|節點名字:" + sdf + "|節點文本:" + dsf + "|節點本地名字" + xxNode.Value;
name += sdf + ":" + dsf;
}
a = name + "---------------------------" + a;
//解析XML
}
catch (Exception err)
{
return err.ToString();
}
return a;
}
soap1.1需要使用post請求需要注意的有兩個地方:
1.請求頭需要加soapAction(代碼已在上個模塊,這裏只是再次列出)
webRequest.Headers.Add("SOAPAction", "http://jjj/IQuerySvc/QueryEncounter");
2.解析時需要根據返回的參數增加命名控件(代碼已在上個模塊,這裏只是再次列出)
比如返回的xml信息是這樣的
//返回的xml頭信息
<s:Envelope xmlns:s=\"http://jjjj/soap/envelope/\">
<s:Body>
<QueryEncounterResponse xmlns=\"http://jjjj\">
<QueryEncounterResult xmlns:a=\"http://jjjj/2004/07/JetSun.DataModel.DXS\" xmlns:i=\"http://jjjj/2001/XMLSchema-instance\">
<a:QueryEncounter_Result z:Id=\"i1\" xmlns:z=\"http://jjjj/2003/10/Serialization/\">
//解析方法 那些標籤可以看出命名控件名有s,a,i,z,對應上相應的地址就可以了
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
//此處是soap1.1如下:
mgr.AddNamespace("s", "http://jjjj/soap/envelope/");
mgr.AddNamespace("a", "http://jjjj/2004/07/JetSun.DataModel.DXS");
mgr.AddNamespace("i", "http://jjjj/2001/XMLSchema-instance");
mgr.AddNamespace("z", "http://jjjj/2003/10/Serialization/");
另外一種使用別的插件 以後再補上