【教程】使用 UnityWebRequest 进行 Post Json内容

开发平台: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 引用解释
GETUnityWebReqeust.kHttpVerbGET设置 HTTP 作为 Get 请求数据
HEADUnityWebReqeust.kHttpVerbHEAD
POSTUnityWebReqeust.kHttpVerbPOST设置 HTTP 作为 POST请求数据
PUTUnityWebReqeust.kHttpVerbPUT
CREATEUnityWebReqeust.kHttpVerbCREATE
DELETEUnityWebReqeust.kHttpVerbDELETE

目前笔者较多接触为 PostGet,其余关联提交与本文 Post 的流程大致。但具体应根据 Unity 源码流程参考进行。避免失误。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值