使用 UnityWebRequest 进行简单的 HTTP (POST) 通信

今天工作完成得很好。
我是系统开发部的松山。

这次,我将介绍如何使用 UnitWebRequest 进行 HTTP (POST) 通信。
虽然现在才写这个感觉有点晚了,但我之前只实现了通过 www 进行的通信,所以我想重新学习一下 ^^;

做什么

- 使用 UnitWebRequest 进行 HTTP (POST) 通信
;请求和响应采用 JSON 格式
;设计简洁,并假定用户需要创建多个通信 API。
*使用 Unity 2019.3.5f1 创建

JSON

首先,关于 JSON,我们将使用 Unity 的 JsonUtility 来实现它。JsonUtility
是 Unity 提供的 JSON 解析器,
可以轻松序列化指定为 Serializable 的类和结构体。
虽然它有一些限制,例如不支持 Dictionary 类型,但就性能而言,它似乎优于其他 JSON 解析器。
序列化为 JSON 格式

UnityWebRequest

这是主要的通信处理部分。UnityWebRequest
允许您处理 HTTP 请求和响应

该流程本身编写得非常简单。
它生成一个 POST 格式的 UnityWebRequest 请求,并以 JSON 格式设置请求参数。

    // 设置 HTTP (POST) 信息 var req = new UnityWebRequest(url, "POST"); req.uploadHandler = (UploadHandler)new UploadHandlerRaw(postData); req.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); req.SetRequestHeader("Content-Type", "application/json");

需要注意的是,该参数不能作为字符串传递,因此您需要将其转换为字节数组。

    // 将请求对象转换为 JSON(字节数组)字符串 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 的请求和响应,并以上述通信处理类作为基类。
具体来说,流程大致如下:
创建带有 Serializable 属性的请求和响应结构体,并定义参数。
通信 URL 的公共部分已在基类中定义,因此只需定义末尾的 API 名称即可。

using System; using System.Collections.Generic; namespace Api { ///<summary> /// API 示例 B ///</summary> public class SampleB : Web.ApiBase { public const string Name = "Test/SampleB"; ///<summary> /// 请求参数 ///</summary> [Serializable] public struct Request { public string userId; public List<int> values; } public Request request; ///<summary> /// 响应参数 ///</summary> [Serializable] public struct Response { public int count; public List<int> values; } public Response response; } }

如何使用

首先,生成上面提到的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"; apiB.request.values = new List<int> () { 1, 10, 100, 1000 }; // 通信 apiB.Send<Api.SampleB.Request> (ref apiB.request, result => { // 结果 if (result.isSucceeded) // 成功 { // 提取响应 apiB.response = apiB.Response<Api.SampleB.Response> (); // 检查内容 Debug.Log("SampleB 成功!"); Debug.Log("计数:" + apiB.response.count); foreach(var v in apiB.response.values) { Debug.Log("值:" + v); } } else // 失败 { Debug.Log("SampleB 失败:" + result.error); } }); }

概括

这样,我们就能够以相当简单的方式编写 HTTP 通信处理程序。
我认为它应该可以用于实际应用。
由于它是通信处理程序,因此如果没有服务器端实现就无法工作,但我还是会将示例代码上传到 GitHub。Unity
示例

示例基类没有继承自 MonoBehaviour,因此无法直接使用协程。
这个问题可以通过参考以下文档解决:
在未继承自 MonoBehaviour 的类中使用协程。

最后

我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

好了,今天就到这里。

如果您觉得这篇文章对您有帮助,请点个“赞”!
3
加载中...
3票,平均分:1.00/13
14,278
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

我曾在一家游戏开发公司工作多年,负责编程和项目管理等工作。
2019年,我加入Beyond Inc.,在横滨办公室工作。
我主要负责服务器端开发的项目管理(偶尔也参与编程)。
我的爱好是公路自行车赛和观看赛马。