我们在对接第三方sdk时,第三方sdk通常会以一个webservice接口的形式供我们来调用。而这些接口会以提供我们get,post,soap等协议来进行访问。get,post方法相信大家都比较熟悉了,今天我们着重讨论soap协议的访问。

  soap又叫简单对象访问协议,是交换数据的一种协议规范,soap是基于xml的。webService三要素就包含SOAP、WSDL、UDDI之一, soap用来描述传递信息的格式, WSDL 用来描述如何访问具体的接口, uddi用来管理,分发,查询webService 。SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。更多的信息大家可以网上参考相关资料,soap和wsdl的教程可以看SOAP,WSDL

  下面我们来做一个请求天气预报的例子。网上提供了天气预报免费测试的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

  我们先用unity画出我们需要的效果,因为我们要做一个天气预报的小程序,我们可以先画个蓝天的背景,在做几个动态的云朵,以达到美化的效果。效果如图:

新建一个脚本,并绑定到Canvas上我们的云朵就滚动起来了。

YunScroll.cs

using UnityEngine;
using System.Collections;

public class YunScroll : MonoBehaviour
{
    ;
    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);
        ))
        {
            yun1.position = ), yun1.position.y, yun1.position.z);
        }

        //
        yun2.Translate(Vector3.left * Time.deltaTime * mSpeed);
        ))
        {
            yun2.position = ), yun2.position.y, yun2.position.z);
        }
    }
}

  好了,我们的天空云朵背景已经动起来了,我们再添加显示天气的内容和图片空间。效果如图:

添加脚本WeatherScript并绑定到主摄像机上。

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()
    {
        ; i < panels.Length; ++i)
        {
            Transform[] objs = ];

            objs[] = panels[i].transform.FindChild("Day");
            objs[] = panels[i].transform.FindChild("Temperature");
            objs[] = panels[i].transform.FindChild("Wind");
            objs[] = 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[].InnerXml,
            childNode[].InnerXml,
            childNode[].InnerXml);

        toDayInfo.GetComponent<Text>().text = childNode[].InnerXml;

        ; i < contextDic.Count; ++i)
        {
            contextDic[i][].GetComponent<Text>().text = childNode[ + i * ].InnerXml;
            contextDic[i][].GetComponent<Text>().text = childNode[ + i * ].InnerXml;
            contextDic[i][].GetComponent<Text>().text = childNode[ + i * ].InnerXml;

             + i * ].InnerXml.Split(]);
            Sprite sp = Resources.Load(str, typeof(Sprite)) as Sprite;
            if (sp != null)
            {
                contextDic[i][].GetComponent<Image>().sprite = sp;
            }
        }
    }
}

绑定物体到脚本对应的变量,给按钮添加事件响应,好了,我们一个简单的天气预报应用搞出来了,我们看看效果吧。

模拟器上运行

转载请注明出处:http://www.cnblogs.com/fyluyg/p/6047819.html

下载

Unity3d请求webservice的更多相关文章

  1. jquery+ajax跨域请求webservice

    最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...

  2. Node.js 使用 soap 模块请求 WebService 服务接口

    项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...

  3. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

  4. ajax请求webservice时抛出终止线程的异常

    请求webservice中以下接口,会抛出异常 {"Message":"正在中止线程.","StackTrace":" 在 Sys ...

  5. webserive学习记录6-页面请求webservice

    前面都是通过JAVA代码访问webservice服务,下面将介绍通过javascript,jquery访问webservice服务并介绍过过servlet解决跨域问题的方法. 服务端 编写服务代码,解 ...

  6. 通过HttpClient请求webService

    通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...

  7. Kettle通过Http post请求webservice接口以及结果解析处理

    kettle中有两种方式请求webservice服务,一个是Web服务查询,但是这个有缺陷,无法处理复杂的需求,遇到这种情况就需要用Http post来处理了. 网上也有很多关于Http post请求 ...

  8. ajax请求webservice的过程中遇到的问题总结

    前台用ajax的post方法,无法请求到webservice中的方法的时候,需要在配置文件中添加 web.config文件中的 <system.web> 节点下加入:<webServ ...

  9. AJAX请求WebService

    1.WebService代码 [WebMethod] [ScriptMethod(UseHttpGet = false)] public string GetObject() { User user ...

随机推荐

  1. strlen与sizeof有什么区别?

    其实二者的区别还是很大的,首先strlen计算的长度不包括字符串最后的终止null字节, 而sizeof则计算包括终止null的缓冲区长度.还有一点很容易被忽略,strlen需要一次函数调用, 即它是 ...

  2. Python 用SMTP发送邮件

    一.简介 上面介绍了传统邮件的生成和解析,这些都是non-internet,也就是不需要网络就可一完成的.那么当生成了邮件,下一步就是发送了,本文就讲解利用SMTP协议发送邮件. 正如SMTP(Sim ...

  3. [转]Creating an iPhone Daemon

    ref: http://chrisalvares.com/blog/7/creating-an-iphone-daemon-part-1/ http://chrisalvares.com/blog/3 ...

  4. WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用

    WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用 摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命 ...

  5. Combo模糊匹配中文问题

    茗洋Easy UI 1.3.2 部分问题解决系列专题[Combo模糊匹配中文问题 修复] 本次给大家带来的EasyUI的我研究拓展的新特性 我使用的是  EasyUI 1.3.2版本的,项目是ASP. ...

  6. Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件

    Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件 Quick Launcher 是一个极其简单但实用的 Visual Studio 扩展,支持 Vi ...

  7. 安装Win8

    老毛桃安装Win8(哪里不会点哪里,so easy) 先来一张美女图,是不是很漂亮呢!继续往下看! 求推荐啊! 对于一个干IT的码农来说,会写代码不算什么,会装系统不算什么,及会写代码也会装系统的那才 ...

  8. GTK、KDE、Gnome、XWindows 图形界面

    一.linux图形界面的实现只是linux下的应用程序实现图形界面(GUI)并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xfree的关系就相当于当年的DOS和Wind ...

  9. CSS:用Less实现栅格系统

    CSS:用Less实现栅格系统 背景 公司一直没有专职的前端和美工,Javascript相对来说我熟悉一点,CSS+HTML有四五年没有搞过了,最近要学一下,招聘或和美工配合的时候会有用处. 收集的资 ...

  10. C# 网络编程之最简单浏览器实现

    最近学习C#网络编程的HTTP协议编程,HTTP即Hypertext Transfer Protocol的缩写,意为:超文本传输协议. 其中与HTTP相关的知识主要有六个类的知识,分别是 (1).Ht ...