Unity3D网络通讯(三)-- HttpRestful请求的简单封装
学更好的别人,
做更好的自己。
——《微卡智享》
前言
实现思路
微卡智享
实现Http请求的封装,我们主要考虑的就是两个问题:
所有的网络通讯都写在一个类里,外部调用只考虑传入参数即可,做到解耦效果
Unity的通讯是用协程方式实现网络通讯,怎么处理通讯返回的值后续的操作
代码实现
微卡智享
01
整理代码脚本
02
HttpRestful封装
HttpRestful完整代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class HttpRestful : MonoBehaviour
{
private static HttpRestful _instance;
public static HttpRestful Instance
{
get
{
if(_instance == null)
{
GameObject goRestful = new GameObject("HttpRestful");
_instance = goRestful.AddComponent<HttpRestful>();
}
return _instance;
}
}
/// <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);
}
}
}
public void Post(string url, string data, Action<bool, string> actionResult = null)
{
StartCoroutine(_Post(url, data, actionResult));
}
private IEnumerator _Post(string url, string data, Action<bool, string> action)
{
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();
string resstr = "";
if (request.isNetworkError || request.isHttpError)
{
resstr = request.error;
}
else
{
resstr = request.downloadHandler.text;
}
if (action != null)
{
action(request.isHttpError, resstr);
}
}
}
}
03
调用HttpRestful
HttpRestful.Instance.Get(url, actionRes);
HttpRestful.Instance.Post(url, json, actionRes);
UIScipts完整代码
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;
//定义一个返回数据的Action
private Action<bool, string> actionRes;
// Start is called before the first frame update
void Start()
{
InitAction();
//Get按钮操作
btnget.onClick.AddListener(() =>
{
Debug.Log(edturl.text);
string url = edturl.text;
HttpRestful.Instance.Get(url, actionRes);
});
btngetparm.onClick.AddListener(() =>
{
string url = edturl.text;
string param = edtparm.text;
string allurl = url + "/Info?Summary=" + param;
HttpRestful.Instance.Get(allurl, actionRes);
});
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);
HttpRestful.Instance.Post(url, json, actionRes);
});
}
/// <summary>
/// 写返回Action的处理方法
/// </summary>
private void InitAction()
{
actionRes = new Action<bool, string>((bl, str) =>
{
if (bl)
{
txtshow.text = str;
}
else
{
string resjson = "{\"array\":" + str + "}";
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 + "\r\n");
}
txtshow.text = sb.ToString();
}
});
}
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;
}
}
实现效果
完
扫描二维码
获取更多精彩
微卡智享
「 往期文章 」
Unity3D网络通讯(二)--UnityWebRequest及JsonUtility请求Http Restful
本文分享自微信公众号 - 微卡智享(VaccaeShare)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
LeetCode | 35.搜索插入位置
点击上方蓝字关注我们 这次来写一下 LeetCode 的第 35 题,搜索插入位置。 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 这个题目是要对给定的值在数组中找到合适的插入位置,而且数组是有序的。 问题分析 这个题目中要求将给定的值在一个有序的数组中找到合适的插入位置,也就说将给定的值插入到数组后,数组仍然保持有序。这个题目可以通过二分法来查找合适的位置,因为数组是有序的,这样的时间复杂度是O(logN)。也可以通过顺序遍历整个数组来进行查找合适的插入位置,但是这样的话时间复杂度会高一些,它的时间复杂度为O(N)。 我以为使用直接遍历整个数组的方式无法通过该题目,但是竟然通过了,那么就直接贴出遍历数组的代码吧。 代码实现 代码实现如下: int searchInsert(int* nums, int numsSize, int target){ int i = 0; for (; i < numsSize; i ++) { if (target <= nums[i]) { break; } } return ...
- 下一篇
使用2D卷积技术进行时间序列预测
本文将展示一种新的时间序列预测方法。 目标数据集 在这个项目中使用的数据是来自北卡罗来纳州夏洛特分校的全球能源预测竞赛的数据。您可以在这里找到更多信息:http://www.drhongtao.com/gefcom/2017 你需要知道的是,这些数据是来自能源网络的各种读数。我们的目标是利用这些数据点预测电网的实时能源需求。数据点还包括露点和干球温度,因为空调是能源消耗的主力。 我们的目标变量是RTDemand(Real Time energy demand):电网的实时能源需求。数据具有清晰的日周期特征。以下是我们三天的数据: 三天内的每小时数据 在每个人都在睡觉的半夜里,我们的耗电量达到最低。我们早上醒来,开始工作,当太阳达到峰值强度时,我们的能量消耗达到了最大值。因此可以认为每天的能耗下降与通勤时间相对应。 如果我们再把尺度放大一些,我们可以看到清晰的自相关特性和日趋势。以下是大约3周的数据: 三周内的每小时数据 我们还可以注意到一个更大的季节性趋势,如果我们进一步缩小并查看一整年的数据: 一年内的每小时数据 由此看见,这是一个相当理想的时间序列数据,可以对其进行预测。 单变量纯...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16