Unity3D网络通讯(六)-- UnityWebRequest实现WebService通讯
前言
前面几篇文章把主要的网络通讯方式都已经讲完了,今天是这个系列的最后一讲,关于WebService的通讯,主要是现在这个也不是主流,但是像如果对数据交互的老系统中用过WebSerive的,我们还是简单讲一下。
WebService通讯
微卡智享
基本调用WebService有两种方式:
- 使用UnityWebRequest调用webService;
- 利用VS自带的 wsdl工具生成 .cs;
上面第二个方式例子应该也挺多的,这里我就不再讲了,这篇主要就是看看用第一种方式调用WebService。
使用细节
1、其实自己写Web Service 时候,你就会发现在Web Service 下就是各种方法。所以使用时候,url后面加上“/”+你写的方法,这样就是执行你相应的相应方法。
2、这里主要注意Get和Post两种方法的区别与使用:get 就是获得数据。post就是向webservice 传送数据。
代码演示
微卡智享
WebService端代码
新建一个WebServiceDemo,然后鼠标右键新建项中,添加一个Web服务(ASMX),上图中右边红框是我已经创建好的服务。
WeatherForecast类创建一个和第一章Asp.Net Core创建的WeatherForecast一样的,这样方便我们Unity调用,不用再多次创建了。
WebService用的是xml格式,不过为了配合Unity的Json,所以我们这里在Nuget组件中还是要添加NewtonsoftJson。
在WebServiceDemo.asmx中我们写入了两个方法,一个不带参数的方法HelloWorld(用Get调用),一个带参数的方法DealWeather(用Post调用)。这样我们简单的WebService就创建完成了,和Asp.Net Core的发布一样,也是先生成文件系统,然后在IIS中新建网站进行发布。
WebSerive的Config
发布后的WebService如果要用Http的Get和Post方法,还需要在Web.config中进行配置
需要在web.config的文件<system.web>的节点下增加
<webServices>
<protocols>
<add name="HttpPost" />
<add name="HttpGet" />
</protocols>
</webServices>
Unity调用WebService
微卡智享
01
创建布局
在我们的Unity项目中再增加两个Button,一个是WebService的Get方法,一个是WebService的Post方法。
UIScript的脚本中加入这两个按钮
然后把这两个按钮拖进我们定义的两个按钮中
02
WebService类
新建了一个WebService的类
因为都是用的UnityWebRequest的方式调用,所以Get方法其实和HttpRestful中的Get方法基本一致,都是用的协程的方式处理,上图中标红框中不一样是因为通过WebService返回的数据是xml格式的,在Unity中我就不做解析了,所以这里参数前面加了个!
Post的方式和HttpRestful的方式就不一样了,这里调用WebService的Post方式,需要用WWWForm的类型传入。
WebService完整代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class WebService : MonoBehaviour
{
private static WebService _instance;
public static WebService Instance
{
get
{
if (_instance == null)
{
GameObject goRestful = new GameObject("WebService");
_instance = goRestful.AddComponent<WebService>();
}
return _instance;
}
}
#region Get请求
/// <summary>
/// Get请求
/// </summary>
/// <param name="url"></param>
/// <param name="actionResult"></param>
public void Get(string url, Action<bool, string> actionResult = null)
{
StartCoroutine(_Get(url, actionResult));
}
private IEnumerator _Get(string url, Action<bool, string> action)
{
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
yield return request.SendWebRequest();
string resstr = "";
if (request.isNetworkError || request.isHttpError)
{
resstr = request.error;
}
else
{
resstr = request.downloadHandler.text;
}
if (action != null)
{
action(!request.isHttpError, resstr);
}
}
}
#endregion
#region POST请求
public void Post(string url, WWWForm data, Action<bool, string> actionResult = null)
{
StartCoroutine(_Post(url, data, actionResult));
}
private IEnumerator _Post(string url, WWWForm data, Action<bool, string> action)
{
using (UnityWebRequest request = UnityWebRequest.Post(url, data))
{
yield return request.SendWebRequest();
string resstr = "";
if (request.isNetworkError || request.isHttpError)
{
resstr = request.error;
}
else
{
resstr = request.downloadHandler.text;
}
if (action != null)
{
action(!request.isHttpError, resstr);
}
}
}
#endregion
}
03
调用方法
Get方式调用
//WebService Get
btnwsget.onClick.AddListener(() =>
{
string url = "http://" + edtipadr.text + ":" + edtport.text + "/WebServicedemo.asmx/HelloWorld";
WebService.Instance.Get(url, actionRes);
});
Post调用
//WebService Post
btnwspost.onClick.AddListener(() =>
{
string url = "http://" + edtipadr.text + ":" + edtport.text + "/WebServicedemo.asmx/DealWeather";
WeatherForecast item = new WeatherForecast();
item.Summary = "Alvin";
item.Date = DateTime.Now;
item.TemperatureC = 10;
item.TemperatureF = 20;
string json = JsonUtility.ToJson(item);
WWWForm form = new WWWForm();
form.AddField("json", json);
WebService.Instance.Post(url, form, actionRes);
});
实现效果
- Spring 常见问题与解决方法
- 如何通过css控制内容显示顺序 第二行的内容优先显示
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搭建 Apache Jmeter 分布式压测与监控,真那么难搞定?|实战干货
- PAT (Basic Level) Practice (中文)1056 组合数的和
- PAT (Basic Level) Practice (中文)1057 数零壹
- PAT (Basic Level) Practice (中文)1063 计算谱半径
- PAT (Basic Level) Practice (中文)1064 朋友数
- PAT (Basic Level) Practice (中文)1076 Wifi密码
- PAT (Basic Level) Practice (中文)1077 互评成绩计算
- PAT (Basic Level) Practice (中文)1081 检查密码
- PAT (Basic Level) Practice (中文)1082 射击比赛
- PAT (Basic Level) Practice (中文)1083 是否存在相等的差
- 2017年天梯赛全国总决赛题集 L2-1 点赞狂魔
- 2017年天梯赛全国总决赛题集 L1-4 稳赢
- 2017年天梯赛全国总决赛题集 L1-8 矩阵A乘以B
- 你真的了解synchronized吗?
- 2017年天梯赛大区赛题集 7-1 出生年