Unity3d请求webservice
我们在对接第三方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的更多相关文章
- jquery+ajax跨域请求webservice
最近几天在学习webservice...在学习的时候便想到用ajax的方式去请求webservice.. 一直在测试..如果这个被请求的webservice和自己使用的是同一个端口号.则不用考虑那aj ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- JQuery请求WebService返回数据的几种处理方式
打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...
- ajax请求webservice时抛出终止线程的异常
请求webservice中以下接口,会抛出异常 {"Message":"正在中止线程.","StackTrace":" 在 Sys ...
- webserive学习记录6-页面请求webservice
前面都是通过JAVA代码访问webservice服务,下面将介绍通过javascript,jquery访问webservice服务并介绍过过servlet解决跨域问题的方法. 服务端 编写服务代码,解 ...
- 通过HttpClient请求webService
通过HttpClient请求webService 由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求, ...
- Kettle通过Http post请求webservice接口以及结果解析处理
kettle中有两种方式请求webservice服务,一个是Web服务查询,但是这个有缺陷,无法处理复杂的需求,遇到这种情况就需要用Http post来处理了. 网上也有很多关于Http post请求 ...
- ajax请求webservice的过程中遇到的问题总结
前台用ajax的post方法,无法请求到webservice中的方法的时候,需要在配置文件中添加 web.config文件中的 <system.web> 节点下加入:<webServ ...
- AJAX请求WebService
1.WebService代码 [WebMethod] [ScriptMethod(UseHttpGet = false)] public string GetObject() { User user ...
随机推荐
- iOS基础 - 核心动画
一.核心动画 l 核心动画基本概念 l 基本动画 l 关键帧动画 l 动画组 l 转场动画 l Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事 ...
- iOS基础 - 控件属性
一.控件的属性 1.CGRect frame 1> 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0, 0)) 2> 修改这个属性,可以调整控件的位置和尺寸 2.CGPoint cen ...
- Mac OS X安装之硬盘和光盘引导总结
继上一篇虚拟机环境下的安装,这篇文档主要描述硬盘和光盘引导安装Mac OS X,并可实现多操作系统. 硬盘安装: 首先介绍下硬盘安装需要用到的软件. Java虚拟机.作为HFSExplorer的运行前 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- Helper Method
ASP.NET MVC 小牛之路]13 - Helper Method 我们平时编程写一些辅助类的时候习惯用“XxxHelper”来命名.同样,在 MVC 中用于生成 Html 元素的辅助类是 Sys ...
- oracle数据库对date字段类型存在空值进行排序的处理方法
oracle数据库对date字段类型存在空值进行排序的处理方法 oracle 数据库,如果表中有一个字段类型为date,且该字段类型存在空值,并且需要排序, 解决方法为使用oracl ...
- .NET重构—单元测试重构
.NET重构—单元测试重构 阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1 ...
- Weka开发[2]-分类器类
这次介绍如何利用weka里的类对数据集进行分类,要对数据集进行分类,第一步要指定数据集中哪一列做为类别,如果这一步忘记了(事实上经常会忘记)会出现“Class index is negative (n ...
- Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext 背景 之前写过两篇文章介绍模型的合法性: DDD:关于模型的合法性,Entity.IsValid( ...
- 搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境
搭建基于SSI(struts2,spring,ibatis)的javaEE开发环境 最近有很多人不知道如何搭建基于SSI(struts2,spring,ibatis)的J2EE开发环境,这里给大家一个 ...