当前位置:   article > 正文

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

unitywebrequest.post

开发平台: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();
}
  • 1
  • 2
  • 3
  • 4
  • 5

  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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对应的 SetUpPost(UnityWebReqeust, jsonData)

public static void SetupPost(UnityWebReqeust request, string json)
{
	request.downloadHandler= new DownloadHandlerBuffer();
	if (!string.IsNullOrEmpty(json))
	{
		byte[] array = Encoding.UTF8.GetBytes(jsonData);
		request.uploadHandler = new UploadHandlerRaw(array);
		request.uploadHandler.contentType = "application/json;charset=utf-8";
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

部分网络文章并不会使用 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) { //同上 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

using UnityNetwork = UnityEngine.Network;
using UnityNetworkExtension = UnityEngine.Network.Extension;
 
public class Example
{
	IEnuemrator Start()
	{
		using UnityNetwork.UnityWebRequest request = UnityNetworkExtension.UnityWebRequest.Post(url, json)
		//.....
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

  • 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 源码流程参考进行。避免失误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/620312
推荐阅读
相关标签
  

闽ICP备14008679号