Unity: 在Unity3D中使用HTTP PUT

6
我对Unity很新,并且在RESTFul方面遇到了一些问题。 我想通过使用HTTP PUT在服务器上更新一些数据,但是当我搜索网络时得知,Unity中的WWWW类不支持HTTP PUT。我还尝试了一些与HTTP PUT相关的HttpWebRequest示例,但始终收到错误代码400:坏请求。
如何解决这个问题? 在更新时,我是否需要列出所有键值对,还是只需要列出我想要更改值的键值对?
3个回答

8
如果您不想使用第三方插件并且假设您的服务器支持它,那么您可以考虑使用“X-HTTP-Method-Override” HTTP头的一种方法。您的客户端通过POST将数据发送到服务器,但服务器将其处理为X-HTTP-Method-Override标头中的值(例如PUT)。
我们之前在支持此功能的服务器上使用过这种方法,并且效果非常好。在Unity3d中使用此方法的示例如下:
string url = "http://yourserver.com/endpoint";
byte[] body = Encoding.UTF8.GetBytes(json);    

Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add( "Content-Type", "application/json" );
headers.Add( "X-HTTP-Method-Override", "PUT" );
WWW www = new WWW(url, body, headers);

1
我建议使用BestHTTP包代替默认的WWW类。与游戏行业中典型中间件价格相比,它便宜得多(几乎所有Unity3d资产都是如此),根据个人经验,它表现相当不错。
另外,您也可以使用标准的.NET sockets

我也查看了BestHTTP,但我们是学生,正在为毕业制作毕业项目。对我们来说,价格是一个大问题。 - Brian Pham
那么看起来您将不得不使用套接字。Unity提供的WWW类非常基础,更适用于简单的下载而不是与API交互。 - Max Yankov
对于我的第二个问题,我需要通过HTTP PUT发送所有键值对还是只需要更新的键值对?因为当我使用Chrome的POSTMAN扩展测试API时,它要求我填写所有键值对。如果我只列出需要更新的键值对,则会出现错误。 - Brian Pham

0

我通过使用 HttpWebRequest 的以下代码使其工作

void updatePlayer(){
    var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://yourAPIUrl");
    httpWebRequest.ContentType = "text/json";
    httpWebRequest.Method = "PUT";

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        string json = "{" +
            "'ID': '100'," +
            "'ClubName': 'DEF'," +
            "'Number': 102," +
            "'Name': 'AnNT'," +
            "'Position': 'GK'," +
            "'DateOfBirth': '2010-06-15T00:00:00'," +
            "'PlaceOfBirth': 'Hanoi'," +
            "'Weight': 55," +
            "'Height': 1.55," +
            "'Description': 'des'," +
            "'ImageLink': 'annt.png'," +
            "'Status': false," +
            "'Age': '12'" +
            "}";            
        streamWriter.Write(json);
    }
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var responseText = streamReader.ReadToEnd();
        //Now you have your response.
        //or false depending on information in the response
        Debug.Log(responseText);            
    }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接