开发平台:Unity 2020 版本以上
编程平台:Visaul Studio 2022
编程语言:CSharp 6.0 以上

一、前言


public IEnumerator Start()
{
	using UnityWebRequest reqeust = UnityWebRequest.Get("http://192.168.16.80:8080/Example",  "postData")
	yield return request.SendWebReqeust();
}

  Unity 官方文档中使用 UnityWebRqeust.Get(url, postData) 来获取地址返回数据。与 UnityWebRequest.Get() 同样。

  但实际网络文章有一些篇幅以 new UnityWebReqeust(url, method) 开头方式获取地址返回数据。这在官方文档中并未详细的提供说明描述。于是对于 Post 的使用方式出现了疑惑,即 何时使用 两者

二、聚焦 UnityWebRequest.Post


官方对 该请求方法 提供了10种重载方法。如下其中一种所示:

public static UnityWebRequest Post(string uri, string postData)
{
	UnityWebRequest request = new UnityWebRequest(uri, "POST");
	SetupPost(request, postData);
	return request;
}

注意SetupPostUnityWebReqeust 针对 Post 提供了 string 类型与 WWWForm 类型的重载方法。其中:

  • WWWForm 明确数据 Post 形式为表单
  • string 则是在方法中 UnityWebReqeust.uploadHandler.contentType = "application/x-www-form-urlencoded" 强调为表单。

根据 UnityWebReqeust.Post 的源码解释,这10种重载的方法均 强制使用 表单 作为Post内容。因此仅能要求服务端必须以表单形式解析数据内容。

三、我需要以 Json 形式进行 Post


是的,这是 UnityEngine 中并未提供的内容。因此需要按照 Post 表单流程,更变为 Post Json 字符串内容。

public static UnityWebRequest Post(string uri, string json)
{
	UnityWebRequest request = new UnityWebRequest(uri, "POST");
	SetupPost(request, json);
	return request;
}

对应的 SetUpPost(UnityWebReqeust, jsonData)

public static void SetupPost(UnityWebRequest request, string json)
{
	request.downloadHandler= new DownloadHandlerBuffer();
	if (!string.IsNullOrEmpty(json))
	{
		byte[] array = Encoding.UTF8.GetBytes(json);
		request.uploadHandler = new UploadHandlerRaw(array);
		request.uploadHandler.contentType = "application/json;charset=utf-8";
	}
}

部分网络文章并不会使用 request.uploadHanlder.contentType = "application/json;charset=utf-8" 来标识内容信息。
与之相对用 reqeust.SetReqeustHeader("Content-Type", "application/json;charset=utf-8") 标识上传数据格式。

两种方式均可使用。并不影响结果返回。

关于 Request.SetReqeusetHeader()
  这似乎是一个不受请求方式限制方法。例如:Get 中设置请求参数。

四、试试封静态类调用


  毕竟引用 UnityEngine.Network.dll,直接修改源码补充显然是不可能的。为了习惯上使用 UnityWebRequest.Post()。新建一个命名空间下的类 UnityWebRequest ,例如:

using UnityEngine.Network;
using UnityEngine;

namespace UnityEngine.Network.Extension;

public class UnityWebReqeust
{
	public static UnityWebRequest Post(string uri, string json) { //抄写上一部分内容 }
	public static UnityWebRequest Post(Uri uri, string json) { //同上 }

	private static void SetupPost(UnityWebRequest request, string json) { //同上 }
}

  这样,在使用的时候按习惯为

using UnityNetwork = UnityEngine.Network;
using UnityNetworkExtension = UnityEngine.Network.Extension;
 
public class Example
{
	IEnuemrator Start()
	{
		using UnityNetwork.UnityWebRequest request = UnityNetworkExtension.UnityWebRequest.Post(url, json)
		//.....
	}
}

事实上,为了避免引用上的阅读的理解 使用其他命名会更佳阅读表现。

  • using UnityWebReqeust reqeust = UniNetCustom.UniWeb.Post(url, json)

五、关于 UnityWebRequest


UnityWebRequest(string url, string method)

  • method :指定本次 HTTP 的使用方向,要求为大写字符串。但更多推荐使用 UnityWebRequest.内定字符 作为标识符。

字符串

UnityWebRquest 引用

解释

GET

UnityWebReqeust.kHttpVerbGET

设置 HTTP 作为 Get 请求数据

HEAD

UnityWebReqeust.kHttpVerbHEAD

POST

UnityWebReqeust.kHttpVerbPOST

设置 HTTP 作为 POST请求数据

PUT

UnityWebReqeust.kHttpVerbPUT

CREATE

UnityWebReqeust.kHttpVerbCREATE

DELETE

UnityWebReqeust.kHttpVerbDELETE

目前笔者较多接触为 PostGet,其余关联提交与本文 Post 的流程大致。