UnityWebRequest POST 未发送 Body
UnityWebRequest POST not sending Body
正如标题所说,代码如下。我试过设置 chunkedTransfer=false、Content-Type application/json、WWWForm、手动构建 JSON object 和 HttpClient。对于 Content-Type application/json,甚至没有命中 API。对于其余部分,body 是空的 object。通过 Whosebug、YouTube、Unity 文档和所有其他资源,我不知道这里的问题是什么。
截至今天早上,我正在使用 Newtonsoft.Json 序列化 JSON body。我认为现在最大的问题是当我设置 webRequest.SetRequestHeader("Content-Type", "application/json");
时 API 路由甚至没有收到请求。
async Task<string> makeRequest()
{
string url = API_BASE + "/users";
Dictionary<string, string> body = new Dictionary<string, string>();
body.Add("username", username);
body.Add("password", password);
body.Add("email", email);
using (UnityWebRequest webRequest = UnityWebRequest.Post(url, JsonConvert.SerializeObject(body)))
{
await webRequest.SendWebRequest();
string result = Encoding.UTF8.GetString(webRequest.downloadHandler.data);
if (webRequest.result != UnityWebRequest.Result.Success)
{
JSONNode error = JSON.Parse(result);
registerAndLoginError.GetComponent<Text>().text = error["error"]["message"];
registerAndLoginError.SetActive(true);
return "";
}
}
BasicLogin();
return "";
}
内置 JsonUtility
不支持 Dictionary
! 它遵循与 Inspector 相同的序列化规则,请参阅 Script Serialization。
=> JsonUtility.ToJson(body)
将只是 return ""
或者在最好的情况下 "{}"
.
尝试“手动”创建 JSON 字符串,例如
var json = "{\"username\":\""+username+"\", \"password\":\""+password+"\", \"email\":\""+email+"\"}";
或使用不同的库,例如Newtonsoft .NET Json
(可用 Package via the PackageManager)支持集合和字典的直接(反)序列化。
所以我在其他地方看到了这个解决方案,但我继续忽略它,因为它很老套,看起来应该解决。但是,我现在正处于不关心的地步。
- 使用
UnityWebRequest.Put
代替UnityWebRequest.Post
- 设置
webRequest.method = "POST";
- 设置
webRequest.SetRequestHeader("Content-Type", "application/json");
这可行,但感觉真的很糟糕,没有任何意义。
正如标题所说,代码如下。我试过设置 chunkedTransfer=false、Content-Type application/json、WWWForm、手动构建 JSON object 和 HttpClient。对于 Content-Type application/json,甚至没有命中 API。对于其余部分,body 是空的 object。通过 Whosebug、YouTube、Unity 文档和所有其他资源,我不知道这里的问题是什么。
截至今天早上,我正在使用 Newtonsoft.Json 序列化 JSON body。我认为现在最大的问题是当我设置 webRequest.SetRequestHeader("Content-Type", "application/json");
时 API 路由甚至没有收到请求。
async Task<string> makeRequest()
{
string url = API_BASE + "/users";
Dictionary<string, string> body = new Dictionary<string, string>();
body.Add("username", username);
body.Add("password", password);
body.Add("email", email);
using (UnityWebRequest webRequest = UnityWebRequest.Post(url, JsonConvert.SerializeObject(body)))
{
await webRequest.SendWebRequest();
string result = Encoding.UTF8.GetString(webRequest.downloadHandler.data);
if (webRequest.result != UnityWebRequest.Result.Success)
{
JSONNode error = JSON.Parse(result);
registerAndLoginError.GetComponent<Text>().text = error["error"]["message"];
registerAndLoginError.SetActive(true);
return "";
}
}
BasicLogin();
return "";
}
内置 JsonUtility
不支持 Dictionary
! 它遵循与 Inspector 相同的序列化规则,请参阅 Script Serialization。
=> JsonUtility.ToJson(body)
将只是 return ""
或者在最好的情况下 "{}"
.
尝试“手动”创建 JSON 字符串,例如
var json = "{\"username\":\""+username+"\", \"password\":\""+password+"\", \"email\":\""+email+"\"}";
或使用不同的库,例如Newtonsoft .NET Json
(可用 Package via the PackageManager)支持集合和字典的直接(反)序列化。
所以我在其他地方看到了这个解决方案,但我继续忽略它,因为它很老套,看起来应该解决。但是,我现在正处于不关心的地步。
- 使用
UnityWebRequest.Put
代替UnityWebRequest.Post
- 设置
webRequest.method = "POST";
- 设置
webRequest.SetRequestHeader("Content-Type", "application/json");
这可行,但感觉真的很糟糕,没有任何意义。