咱們在對接第三方sdk時,第三方sdk一般會以一個webservice接口的形式供咱們來調用。而這些接口會以提供咱們get,post,soap等協議來進行訪問。get,post方法相信你們都比較熟悉了,今天咱們着重討論soap協議的訪問。html
soap又叫簡單對象訪問協議,是交換數據的一種協議規範,soap是基於xml的。webService三要素就包含SOAP、WSDL、UDDI之一, soap用來描述傳遞信息的格式, WSDL 用來描述如何訪問具體的接口, uddi用來管理,分發,查詢webService 。SOAP 能夠和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP使用基於XML的數據結構和超文本傳輸協議(HTTP)的組合定義了一個標準的方法來使用Internet上各類不一樣操做環境中的分佈式對象。更多的信息你們能夠網上參考相關資料,soap和wsdl的教程能夠看SOAP,WSDL。web
下面咱們來作一個請求天氣預報的例子。網上提供了天氣預報免費測試的webservice接口,不過天天有使用次數限制。更多的接口信息能夠訪問http://www.webxml.com.cn/zh_cn/index.aspx。查看http://www.webxml.com.cn/zh_cn/index.aspx找到咱們天氣預報須要的"getWeather"接口,咱們能夠看到這個接口提供post,get和soap的訪問方法。咱們這個小程序用到post和soap的訪問方法,因此咱們要看他提供的post和soap的使用方式。小程序
這個是post的使用方式,咱們向webservice發起帶theCityCode=string&theUserID=string的參數請求就能夠了。其中theCityCode爲城市名稱好比"深圳",或者深圳對應的code"2419",不能爲空。theUserID是會員id,能夠爲空,爲空則是無償使用。下面的是請求返回,它是一個xml形式的字符數組。
數組
這是soap訪問的使用方式,咱們經過soap訪問構造一個xml的soap,其中theCityCode和theUserID是參數和上面的post方式同樣。好了,輪到咱們的unity3d上場了。數據結構
咱們先用unity畫出咱們須要的效果,由於咱們要作一個天氣預報的小程序,咱們能夠先畫個藍天的背景,在作幾個動態的雲朵,以達到美化的效果。效果如圖:分佈式
新建一個腳本,並綁定到Canvas上咱們的雲朵就滾動起來了。post
YunScroll.cs測試
using UnityEngine; using System.Collections; public class YunScroll : MonoBehaviour { private const int bg_w = 937; private const float mSpeed = 30.0f; Transform yun1; Transform yun2; // Use this for initialization void Start() { yun1 = transform.FindChild("yun1"); Debug.Assert(yun1 != null, "對象找不到"); yun2 = transform.FindChild("yun2"); Debug.Assert(yun2 != null, "對象找不到"); } // Update is called once per frame void Update() { // yun1.Translate(Vector3.left * Time.deltaTime * mSpeed); if (yun1.position.x <= -(bg_w / 2)) { yun1.position = new Vector3(bg_w + (bg_w / 2), yun1.position.y, yun1.position.z); } // yun2.Translate(Vector3.left * Time.deltaTime * mSpeed); if (yun2.position.x <= -(bg_w / 2)) { yun2.position = new Vector3(bg_w + (bg_w / 2), yun2.position.y, yun2.position.z); } } }
好了,咱們的天空雲朵背景已經動起來了,咱們再添加顯示天氣的內容和圖片空間。效果如圖:ui
添加腳本WeatherScript並綁定到主攝像機上。this
WeatherScript.cs:
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; using System.Text; using System.Xml; using UnityEngine.UI; public class WeatherScript : MonoBehaviour { enum Request_Type { POST, SOAP, } public Text title; public Text toDayInfo; public GameObject[] panels; private Dictionary<int, Transform[]> contextDic = new Dictionary<int, Transform[]>(); // Use this for initialization void Start() { for (int i = 0; i < panels.Length; ++i) { Transform[] objs = new Transform[4]; objs[0] = panels[i].transform.FindChild("Day"); objs[1] = panels[i].transform.FindChild("Temperature"); objs[2] = panels[i].transform.FindChild("Wind"); objs[3] = panels[i].transform.FindChild("Image"); contextDic[i] = objs; } // TextAsset textAsset = (TextAsset)Resources.Load("weather_2"); // ParsingXml(textAsset.text, Request_Type.SOAP); } // Update is called once per frame void Update() { } /// <summary> /// post調用 /// </summary> public void OnPost() { StartCoroutine(PostHandler()); } /// <summary> /// soap調用 /// </summary> public void OnSoap() { StartCoroutine(SoapHandler()); } IEnumerator PostHandler() { WWWForm form = new WWWForm(); form.AddField("theCityCode", "深圳"); form.AddField("theUserID", ""); WWW w = new WWW("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather", form); yield return w; if (w.isDone) { if (w.error != null) { print(w.error); } else { ParsingXml(w.text, Request_Type.POST); } } } IEnumerator SoapHandler() { StringBuilder soap = new StringBuilder(); soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); soap.Append("<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\">"); soap.Append("<soap12:Body>"); soap.Append("<getWeather xmlns=\"http://WebXml.com.cn/\">"); soap.Append("<theCityCode>深圳</theCityCode>"); soap.Append("<theUserID></theUserID>"); soap.Append("</getWeather>"); soap.Append("</soap12:Body>"); soap.Append("</soap12:Envelope>"); WWWForm form = new WWWForm(); var headers = form.headers; headers["Content-Type"] = "text/xml; charset=utf-8"; headers["SOAPAction"] = "http://WebXml.com.cn/getWeather"; headers["User-Agent"] = "gSOAP/2.8"; WWW w = new WWW("http://ws.webxml.com.cn/WebServices/WeatherWS.asmx", Encoding.UTF8.GetBytes(soap.ToString()), headers); yield return w; if (w.isDone) { if (w.error != null) { print(w.error); } else { ParsingXml(w.text, Request_Type.SOAP); } } } private void ParsingXml(string _xml,Request_Type _type) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(_xml); XmlNode arrOfStr = xmlDoc.DocumentElement; XmlNodeList childNode = null; #region POST if (_type == Request_Type.POST) { childNode = arrOfStr.ChildNodes; } #endregion #region SOAP else if (_type == Request_Type.SOAP) { xmlDoc.LoadXml(arrOfStr.InnerXml); arrOfStr = xmlDoc.DocumentElement; xmlDoc.LoadXml(arrOfStr.InnerXml); arrOfStr = xmlDoc.DocumentElement; xmlDoc.LoadXml(arrOfStr.InnerXml); arrOfStr = xmlDoc.DocumentElement; childNode = arrOfStr.ChildNodes; } #endregion title.GetComponent<Text>().text = String.Format("<color=red>{0}</color>。{1},{2}", childNode[0].InnerXml, childNode[4].InnerXml, childNode[5].InnerXml); toDayInfo.GetComponent<Text>().text = childNode[6].InnerXml; for (int i = 0; i < contextDic.Count; ++i) { contextDic[i][0].GetComponent<Text>().text = childNode[7 + i * 5].InnerXml; contextDic[i][1].GetComponent<Text>().text = childNode[8 + i * 5].InnerXml; contextDic[i][2].GetComponent<Text>().text = childNode[9 + i * 5].InnerXml; string str = string.Format("a_{0}", childNode[10 + i * 5].InnerXml.Split('.')[0]); Sprite sp = Resources.Load(str, typeof(Sprite)) as Sprite; if (sp != null) { contextDic[i][3].GetComponent<Image>().sprite = sp; } } } }
綁定物體到腳本對應的變量,給按鈕添加事件響應,好了,咱們一個簡單的天氣預報應用搞出來了,咱們看看效果吧。
模擬器上運行