Kot*_*ovP 5 http unity-game-engine unity-webgl
我试图使用一些服务器的API函数,突然出现了这个错误.我将在代码示例后解释它:
public IEnumerator Post(Dictionary<string, string> data)
{
var request = UnityWebRequest.Post(Url, data);
request.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
yield return request.Send();
if (request.isError)
UpdateNetworkLog("Network error has occured: " + request.error);
else
// Some code after success
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,主要是我把它从Unity手动考虑POST请求这里.但是,有一个问题 - 请求从未正确完成,它总是有错误(使用UpdateNetworkLog函数显示):"通用/未知HTTP错误",而请求的响应代码为0.此外,我试图使用遗留本手册中的方法和WWW类获得相同的结果.
我认为,问题在于Unity如何获得响应:我通过Wireshark检查了数据包,我的POST请求和服务器的响应都非常好,没有错误或错误.
另一个重要的问题是我正在使用WebGL,并且编辑器中的所有内容都可以,程序得到正确的响应并正常工作; 只有在浏览器中构建并运行游戏(在Chrome和Safari中测试)后才会出现错误.此外,尝试使用Unity WebGL播放器启动它,但XAMPP:相同.
感谢所有未来的回复,因为Google对此一无所知.
小智 5
从Unity文档中了解如何UnityWebRequest与WebGL 一起使用:
WebGL支持WWW和UnityWebRequest类。它们使用JavaScript中的XMLHttpRequest类通过浏览器处理WWW请求来实现。这对访问跨域资源施加了一些安全限制。基本上,对服务器的任何WWW请求(不同于承载WebGL内容的服务器)都需要由您尝试访问的服务器授权。要访问WebGL中的跨域WWW资源,您要访问的服务器需要使用CORS对此进行授权。
我的最佳猜测是,您尝试访问的服务器没有正确设置或配置CORS。当您的代码在浏览器中运行时,浏览器本身正在处理请求,因此将您的代码置于该浏览器的安全限制之下。您的程序和服务器不在同一个域中,浏览器也不喜欢这样。
如果这是您的问题,那么如果没有更多信息,我很难提出解决方案。从您的帖子中看来,您可能对编码(或至少对与HTTP相关的编码)还不太陌生,而我可以为您的问题找到的最佳解决方案涉及一些相对复杂的方法,例如使用JavaScript代替UnityWebRequest。
当然,实际的问题甚至可能出在您周围的代码上,或者是您尝试访问的服务器上。您要调用的函数的代码是什么Post()?只有在浏览器中运行代码(JavaScript处理POST请求)时,事件顺序才会出现问题。
附带说明一下,如果您尝试访问的服务器具有其API的文档,则您的问题可能会在其中解决。
首先要指出的是UnityWebRequest实际上返回了响应
request.downloadHandler.text
虽然只返回一般错误信息
request.error
现在,如果你的情况是像我和你升级统一只让你的所有网络代码休息,你可能会看到有关错误的Content-Length
这是因为WWW和UnityWebRequest类现在都默认启用了chunkedTransfer.这似乎搞砸了如何发送内容长度并导致错误.
虽然目前可以为UnityWebRequest禁用chunkedTransfer,但在撰写本文时,无法为WWW类禁用它.对我来说,这意味着重写我所有的旧网络代码,而不是使用UnityWebRequest并进行设置
myUnityWebRequest.chunkedTransfer = false;
注意:UnityWebRequest当前不支持没有数据的POST.您仍然需要使用WWW类.
| 归档时间: |
|
| 查看次数: |
13764 次 |
| 最近记录: |