irpas技术客

UnityWebRequest如何发送Json数据格式的Post请求,为什么使用UnityWebRequest.Post会报错?_YY-nb_unity 传输j

irpas 2568

文章目录 🔍 方法一 :new UnityWebRequest🔍 方法二 :UnityWebRequest.Post? UnityWebRequest.Post 会使后端报出数据读取格式错误?? 正确的做法 在前后端的交互中,我们很经常将 Json 格式的数据装入请求体,向后端发送 Post 请求。

Unity 提供了 UnityWebRequest 这个和网络有关的类,我们可以借助它实现数据的请求和响应的接收。想了解详情可参考 Unity 官方文档中相关的 API 介绍:UnityWebRequest

那么下面就来为大家演示一下如何利用 UnityWebRequest 发送 Json 数据格式的 Post 请求。后端的部分我是用基于 Java 的 SpringBoot 框架搭建的程序,对应的接口用了 @RequestBody 注解来接收前端传来的 Json 请求参数。这里就不具体演示后端怎么写了,本篇博客还是把重点放在 Unity 前端的实现方法上,总的来说有两种实现方式,但不论是哪一种,思路都是一样的,只是代码的实现上有些不同。


🔍 方法一 :new UnityWebRequest

如果在百度上搜,可能大部分会搜到这种实现方式,我先附上代码,然后再具体解释:

private void Start() { string url="xxx"; string json="一个Json格式的数据,这里大家替换成自己想要测试的Json数据"; StartCoroutine(I_RequestByJsonBodyPost(url,json)); } private static IEnumerator I_RequestByJsonBodyPost(string url, string json) { UnityWebRequest www = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); DownloadHandler downloadHandler = new DownloadHandlerBuffer(); ·/urlencode) URL 编码后: 这也解释了为什么后端会收到一个%。但因为后端对应的接口设置了只能解析 Json 格式的数据,它明显不认这个 URL 编码,所以报错了。

我们也可以看看 Unity 内部是如何实现这个 Post 方法的(github链接) 可以看到在把 postData 转换为 byte 数组前,它多了一句 URL 编码的转换。

那么如何解决这个问题呢? 我们只能手动创建一个 uploadHandler,覆盖掉原来的 uploadHandler。

? 正确的做法 private static IEnumerator I_RequestByJsonBodyPost(string url, string json) { UnityWebRequest www = UnityWebRequest.Post(url, json); www.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); byte[] bodyRaw = Encoding.UTF8.GetBytes(json); www.uploadHandler = new UploadHandlerRaw(bodyRaw); yield return www.SendWebRequest(); Debug.Log(www.downloadHandler.text); }

后记: 本篇介绍的方法一在网上能够搜到很多类似的介绍。但是当时我也有点纳闷,UnityWebRequest.Post 看起来似乎更加简洁,为什么很少的文章是介绍用 UnityWebRequest.Post 来发送 Json 数据呢?经过尝试我得到了本篇文章里提及的后端的报错。而我之前也一直没注意到 UnityWebRequest.Post(string uri, string postData) 这个方法在内部居然会先进行 URL 编码,也在网上搜了好久,虽然最后总算搜到了相关的资料,但是感觉目前网上对这个问题的解答不是很多。于是就想写这篇博客做一个总结,希望能够帮到更多的小伙伴。 🌹


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Unity #传输json数据 #但是我就纳闷了为什么不能直接用 #而我之前一直没注意到