与 UnityWebRequest 轻松进行 HTTP (POST) 通信
感谢您的辛勤工作。
我是系统开发室的松山。
这次,我将写一下使用UnitWebRequest进行HTTP(POST)通信。
我感觉已经来不及了,但我只是通过www实现了通信,所以我再说一遍^^;
做什么
・与 UnitWebRequst 进行 HTTP (POST) 通信
・请求和响应采用 JSON 格式
・简单,假设将创建多个通信 API
*使用 Unity 2019.3.5f1 创建
JSON
首先,关于JSON,我们将使用Unity的JsonUtility来实现它。
JsonUtility是Unity提供的Json解析器,
可以轻松序列化Serialized类和结构体。
虽然存在不支持Dictionary类型等限制,但在性能方面似乎比其他Json解析器要好。
序列化为Json格式
UnityWeb请求
这是主要的通信过程。
您可以使用 UnityWebRequest 处理 HTTP 请求和响应。
UnityWeb请求
这个过程本身非常简单。
生成POST格式的UnityWebRequest并设置json格式的请求参数。
// 设置 HTTP (POST) 信息 var req = new UnityWebRequest(url, "POST"); req.uploadHandler = (UploadHandler)new UploadHandlerRaw(postData); req.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); “内容类型”,“application/json”);
需要注意的一件事是参数不能作为字符串传递,因此您应该将它们转换为字节数组。
// 将请求对象转换为 JSON(字节数组) string reqJson = JsonUtility.ToJson(request); byte[] postData = System.Text.Encoding.UTF8.GetBytes(reqJson);
准备好后我会提交请求。
// API通信(等待完成)yield return req.SendWebRequest();
由于 isNetworkError 和 isHttpError 均为 false,因此判断通信结果成功。
响应以 Json 格式(文本)存储在 downloadHandler 中。
// 通讯结果 if (req.isNetworkError || req.isHttpError) // 失败 { Debug.Log("网络错误:" + req.error); } else // 成功 { Debug.Log("成功:" + req .downloadHandler.text); }
API控制
创建 API 类的图像,该类使用上述通信处理作为基类来定义每个 API 的请求和响应。
具体是这样的吗?
创建具有可序列化属性的请求和响应结构并定义参数。
通信时URL的公共部分是在基类端定义的,所以在最后定义API名称。
使用 System; 使用 System.Collections.Generic 命名空间 Api { ///<summary> /// API 示例 B ///</summary>公共类 SampleB : Web.ApiBase { public const string Name = "Test/SampleB"; ///<summary> /// 请求参数 ///</summary> [可序列化] public struct Request { public string userId public List;<int>值; } 公共请求请求; ///<summary> /// 响应参数 ///</summary> [可序列化] public struct Response { public int count;<int>值; } 公共响应 } }
如何使用
首先,生成上述的API类。
private Api.SampleB apiB; private Web.ApiBase.Result result; private void Start() { // 通信类生成 apiB = new Api.SampleB(); // API 通信 sendApiB();
指定API名称后,设置要传递给请求结构的值。
它在 Send() 方法中序列化为 JSON 格式,并使用 UnityWebRequest 通过 HTTP (POST) 进行通信。
在回调中接收通信完成并将其反序列化为响应结构。
本来,我会根据响应的内容编写处理,但由于这是一个示例,所以我只是将其输出到控制台。
///<summary> /// API 示例 B 通信 ///</summary> private void sendApiB() { // 设置端点 apiB.EndPoint = Api.SampleB.Name; // 设置请求参数 apiB.request.userId = "beyondB";<int> () { 1, 10, 100, 1000 }; // 通信 apiB.Send<Api.SampleB.Request> (ref apiB.request, result => { // 结果 if (result.isSucceeded) // Success { // 展开响应 apiB.response = apiB.Response<Api.SampleB.Response> (); // 检查内容 Debug.Log("SampleB Succeed!!"); Log (" val : " + v); } } else // 失败 { Debug.Log("SampleB 失败 : " + result.error) }
概括
这样,我就能够非常简单地编写HTTP通信处理了。
我认为暂时可以经受住实际使用。
由于它是一个通信过程,如果没有服务器端实现,它就无法工作,但为了以防万一,我会将示例代码上传到 GitHub 上。
统一示例
由于示例的基类没有继承MonoBehaviour,因此无法直接使用协程。
请将此作为参考。
在不继承 MonoBehavior 的类中使用协程
最后
我开设了我所属的系统开发服务网站“SEKARAKU Lab”。
Beyond是从服务器设计搭建到运营的一站式服务,所以如果您在服务器端开发方面遇到任何问题,请随时联系我们。
SEKARAKU 实验室: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
好了,现在就这些了。