发送Unity Web请求帖子从webhost返回空

时间:2018-07-25 19:39:48

标签: c# http unity3d

iv在这个问题上停留了很长时间,我似乎无法弄清楚问题出在哪里。如果我正在连接到http://localhost/,则此方法非常有效,但是如果我在自己的域上尝试并在线托管,则它突然不会返回任何信息。

这是我的httpPost类:

public static IEnumerator httpPost(string path, string data, Action<APIHttpRequestModel> callback)
{

    byte[] bodyRaw = new System.Text.UTF8Encoding().GetBytes(data);
    var www = new UnityWebRequest(path, UnityWebRequest.kHttpVerbPOST);

    www.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
    www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
    www.SetRequestHeader("Content-Type", "application/json");

    Debug.Log(www.uploadHandler.data); // This still returns the JSON string it's sending

    yield return www.SendWebRequest();

    if (www.isNetworkError)
    {
        Debug.Log("Something went wrong, and returned error: " + www.error);
        callback(new APIHttpRequestModel(false, 400, www.error));
    } else
    {
        Debug.Log(www.downloadHandler.text); // This returns empty because server isn't receiving any data
        if (www.responseCode == 200)
        {
            callback(new APIHttpRequestModel(true, www.responseCode, www.downloadHandler.text));
            Debug.Log(www.downloadHandler.text);
        }
        else
        {
            callback(new APIHttpRequestModel(false, www.responseCode, www.downloadHandler.text));
            Debug.Log(www.downloadHandler.text);
        }
    }
}

我已经尝试调试,这是到目前为止iv所发现的:

  • 如果我尝试对www.uploadHandler.data进行Debug.Log()填充数据。
  • 如果我在服务器上输出请求数据,则没有数据返回
  • 如果我尝试通过REST客户端连接到Web主机上的同一链接,则会返回正确的数据
  • 它肯定会到达指定的URL和路径,但是当我尝试返回请求数据时,它只是空的。

TL; DR:代码正在到达端点,但是没有返回生产服务器上的数据(试图输出发送的数据),如果我在本地执行的话,它可以正常工作。如果我尝试使用REST客户端到生产服务器,那么它也可以正常工作。

编辑1:我下载了最新版本的unity,它似乎运行良好,因此,这绝对是与unity 2017.3.1f1相关的问题。

2 个答案:

答案 0 :(得分:1)

显然这是某些版本的Unity中的错误(我使用的是2017.3.1f1版)

发生这种情况的原因是因为unity随请求一起发送了以下标头:“ Transfer-Encoding:chunked”,许多服务器无法处理。

添加www.chunkedTransfer = false;可以解决此问题,并将其设置为Content-Length的标题

答案 1 :(得分:0)

chunkedTransfer解决方案对我不起作用。 但是实际上您可以使用WWW类而不是UnityWebRequest来执行相同的操作,对我来说这是实际的解决方案。