Unity3D网络通讯(二)--UnityWebRequest及JsonUtility请求Http Restful
前言
上一篇《Unity3D网络通讯(一)--Asp.Net Core WebApi创建发布注意事项》已经把Asp.Net Core的WebApi搭建出来了,今天这篇就来看一下Unity3D使用UnityWebRequest和JsonUnity实现Api接口的通讯。
Unity3D Restful通讯
微卡智享
01
创建项目
新建了一个TransDemo的项目,这次用的是Unity最新的版本2020.1.2f1c1。
因为只是做网络通讯,所以创建的是一个2D的项目,然后左边放了一个Text显示通讯的数据,右边最上面是InputField的url输入框,下面的InputField是参数的输入框,然后我们再新建了四个按钮,分别是Get、GetParm、Post、Json。
02
创建脚本
WeatherForecast类
首先把上一篇NetCore的天气类(WeatherForecast)直接拷贝过来后,我们再改造一下
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class WeatherData
{
public WeatherForecast[] array;
}
[System.Serializable]
public class WeatherForecast
{
public DateTime Date;
public int TemperatureC;
public int TemperatureF;
public string Summary;
}
上面的代码里,首先我们把类上面的属性标签上写上[System.Serializable],代表可以用JsonUtility使用,还有就是定义的属性,如Summary没有赋默认值,这个忘了在哪个文章中看到了,所以我这也就都去掉了。
然后又定义了一个新的类WeatherData,里面定义了WeatherForecast[]的数组,创建这个的原因这里要说一下,Unity3D的JsonUtility组件本身不像NewtonsoftJson那么强大,返回的List<T>的数组Json直接用JsonUtility是反序列化不了的,所以我们这里又增加了一个类,定义了一个WeatherForecat[]的属性。
UIScripts
新建了UIScripts脚本,然后我们把一个Text,两个InputField,四个Button分别定义好。上图中[Header]和[Space]的标签就是在组件栏里显示的好看一点。
将UIScripts脚本挂到Canvas上,然后把对应的组件用鼠标拖拽到定义的组件上,上面红线可以看到,在脚本中定义的Header和Space就是把这个布局变的更规整一些。这样基础工作基本都做完了,接下来就看看具体的实现。
03
JsonUtility的使用
JsonUtility的使用也非常简单,主要的就是两个方法ToJson和FromJson。
脚本中定义一个JsonConvert()的协程方法,实例化一个新的WeatherForecast并赋值后,首先通过JsonUtility序列化,再过3秒后返序列化回来。
然后在btnjson按钮中增加点击监听事件,当点击后直接调用刚才创建JsonConvert事件。
使用效果
04
Get的使用
IEnumerator GetRequest(string url)
{
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
Debug.Log("trans");
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
txtshow.text = request.error;
}
else
{
string resjson = request.downloadHandler.text;
resjson = "{"array":" + resjson + "}";
txtshow.text = resjson;
WeatherData lists = JsonUtility.FromJson<WeatherData>(resjson);
StringBuilder sb = new StringBuilder();
foreach (WeatherForecast item in lists.array)
{
sb.Append("Date:" + item.Date + " Summary:" + item.Summary + " TemperatureF:"
+ item.TemperatureF + "TemperatureC:" + item.TemperatureC + "rn");
}
yield return new WaitForSeconds(3f);
txtshow.text = sb.ToString();
}
}
}
上面是Get的主要调用代码,也是用的协程处理的。
主要想强调的就是上面红框这里,我们当请求成功返回的文本中的格式是一个List<T>数组的Json,前面说过了JsonUtility是直接解析不了的,所以我们定义了一个WeatherData的类,里面的加了一个WeatherForecast的数组定义为array,上面的resjson的字符串我们也改造成这样的方式,再通过FromJson<WeatherData>来反序列化的。
上面的图就是Get方法,和Get带参数的方法调用。
使用效果
05
POST的使用
IEnumerator PostRequest(string url, string data)
{
using (UnityWebRequest request = new UnityWebRequest(url,"POST"))
{
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));
request.SetRequestHeader("content-type", "application/json;charset=utf-8");
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
txtshow.text = request.error;
}
else
{
string resjson = request.downloadHandler.text;
resjson = "{"array":" + resjson + "}";
txtshow.text = resjson;
WeatherData lists = JsonUtility.FromJson<WeatherData>(resjson);
StringBuilder sb = new StringBuilder();
foreach (WeatherForecast item in lists.array)
{
sb.Append("Date:" + item.Date + " Summary:" + item.Summary + " TemperatureF:"
+ item.TemperatureF + "TemperatureC:" + item.TemperatureC + "rn");
}
yield return new WaitForSeconds(3f);
txtshow.text = sb.ToString();
}
}
}
上面是POST使用的核心代码,这块测试倒是花了不少的时间,开始想用的是WWWForm的方式,然后不停地调试总是请求不对,最后才改为使用UploadHandlerRaw的方式进行Post的通讯,直接成功。
还是在Start()方法中加入btnpost的点击方法。
使用效果
UIScripts完整代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class UIScripts : MonoBehaviour
{
[Header("按钮")]
public Button btnget;
public Button btngetparm;
public Button btnjson;
public Button btnpost;
[Space]
[Header("显示")]
public Text txtshow;
[Space]
[Header("输入框")]
public InputField edturl;
public InputField edtparm;
// Start is called before the first frame update
void Start()
{
btnget.onClick.AddListener(()=>
{
Debug.Log(edturl.text);
string url = edturl.text;
StartCoroutine(GetRequest(url));
});
btngetparm.onClick.AddListener(()=>
{
string url = edturl.text;
string param = edtparm.text;
string allurl = url + "/Info?Summary=" + param;
StartCoroutine(GetRequest(allurl));
});
btnjson.onClick.AddListener(() => StartCoroutine(JsonConvert()));
btnpost.onClick.AddListener(() =>
{
WeatherForecast item = new WeatherForecast();
item.Summary = "Alvin";
item.Date = DateTime.Now;
item.TemperatureC = 10;
item.TemperatureF = 20;
string json = JsonUtility.ToJson(item);
string url = edturl.text + "/Reg";
Debug.Log(url);
StartCoroutine(PostRequest(url, json));
});
}
IEnumerator JsonConvert()
{
WeatherForecast item = new WeatherForecast();
item.Summary = "Alvin";
item.Date = DateTime.Now;
item.TemperatureC = 10;
item.TemperatureF = 20;
string json = JsonUtility.ToJson(item);
txtshow.text = json;
yield return new WaitForSeconds(3f);
WeatherForecast newitem = JsonUtility.FromJson<WeatherForecast>(json);
string showtext = "Summary:" + newitem.Summary + " Date:" + newitem.Date +
" C:" + newitem.TemperatureC + " F:" + newitem.TemperatureF;
txtshow.text = showtext;
}
IEnumerator GetRequest(string url)
{
using (UnityWebRequest request = UnityWebRequest.Get(url))
{
Debug.Log("trans");
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
txtshow.text = request.error;
}
else
{
string resjson = request.downloadHandler.text;
resjson = "{"array":" + resjson + "}";
txtshow.text = resjson;
WeatherData lists = JsonUtility.FromJson<WeatherData>(resjson);
StringBuilder sb = new StringBuilder();
foreach (WeatherForecast item in lists.array)
{
sb.Append("Date:" + item.Date + " Summary:" + item.Summary + " TemperatureF:"
+ item.TemperatureF + "TemperatureC:" + item.TemperatureC + "rn");
}
yield return new WaitForSeconds(3f);
txtshow.text = sb.ToString();
}
}
}
IEnumerator PostRequest(string url, string data)
{
using (UnityWebRequest request = new UnityWebRequest(url,"POST"))
{
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));
request.SetRequestHeader("content-type", "application/json;charset=utf-8");
request.downloadHandler = new DownloadHandlerBuffer();
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
txtshow.text = request.error;
}
else
{
string resjson = request.downloadHandler.text;
resjson = "{"array":" + resjson + "}";
txtshow.text = resjson;
WeatherData lists = JsonUtility.FromJson<WeatherData>(resjson);
StringBuilder sb = new StringBuilder();
foreach (WeatherForecast item in lists.array)
{
sb.Append("Date:" + item.Date + " Summary:" + item.Summary + " TemperatureF:"
+ item.TemperatureF + "TemperatureC:" + item.TemperatureC + "rn");
}
yield return new WaitForSeconds(3f);
txtshow.text = sb.ToString();
}
}
}
}
完
- 我是如何处理大并发量订单处理的 KafKa部署总结
- 一步到位分布式开发Zookeeper实现集群管理
- 备胎的养成记KeepAlived实现热备负载
- 0基础搭建Hadoop大数据处理-初识
- 入坑系列之HAProxy负载均衡
- 如何开发自己的搜索帝国之Elasticsearch
- NET中解决KafKa多线程发送多主题的问题
- mysql数据与Hadoop之间导入导出之Sqoop实例
- 如何将mysql数据导入Hadoop之Sqoop安装
- 常见的几种Flume日志收集场景实战
- 教你一步搭建Flume分布式日志系统
- 几十条业务线日志系统如何收集处理?
- 0基础搭建Hadoop大数据处理-编程
- 0基础搭建Hadoop大数据处理-集群安装
- 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 数组属性和方法
- Linux关机命令及步骤
- Java实现二叉树层次遍历:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- Django 用户认证系统使用总结
- 前端综合面试题(9道)
- 用SQL查询Oracle数据库名和实例名
- Hadoop历史服务器配置详细步骤
- MySQL常见关键字优先级
- Linux进程管理命令及状态详解
- sqoop把hive数据导入mysql出现中文乱码
- Flink实现WordCount(实操详细步骤)
- 在客户端创建要素图层 (FeatureLayer)
- 11.深入k8s:kubelet工作原理及其初始化源码分析
- 关于搜索,你不知道的是.....
- oracle查询表前十条数据
- sql语句查oracle版本号