【发布时间】:2019-04-03 09:38:32
【问题描述】:
我正在开发一个新的统一应用程序,它使用 Api Azure Face:
我对 UniteWebRequest 的发布请求有疑问。我有两个功能,第一个使用 HttpClient 并且有效!
public async void giveTempFaceID(string Url)
{
HttpClient client = new HttpClient();
string azurKey = GameManager.instance.AzurKey;
string faceListName = GameManager.instance.faceListName;
string UriBase = GameManager.instance.UriBaseDetect;
string requestParameters =
"returnFaceId=true&returnFaceLandmarks=true&returnFaceAttributes=age,gender,headPose," +
"smile,facialHair,glasses,hair,makeup,occlusion,accessories,blur,exposure," +
"noise&recognitionModel=recognition_02&returnRecognitionModel=false";
string jsonParameters = "{\"url\": \"" + Url + "\"}";
string uri = UriBase + "?" + requestParameters;
client.DefaultRequestHeaders.Add(
"Ocp-Apim-Subscription-Key", azurKey);
HttpResponseMessage response;
byte[] byteData = Encoding.UTF8.GetBytes(jsonParameters);
using (var content = new ByteArrayContent(byteData))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
response = await client.PostAsync(uri, content);
}
string tmpContent = await response.Content.ReadAsStringAsync();
Debug.Log(uri);
Debug.Log(tmpContent);
Debug.Log(jsonParameters);
JSONNode data = JSON.Parse(tmpContent);
string faceId = data[0]["faceId"].Value;
Debug.Log(faceId);
}
void Start()
{
giveTempFaceID("http://psycho2rue.fr/wp-content/uploads/2015/01/visage9-e1345982192269.jpg"));
}
但我想使用 UnityWebRequest 但它不起作用:
IEnumerator giveTempFaceId(string url)
{
string azurKey = GameManager.instance.AzurKey;
string faceListName = GameManager.instance.faceListName;
string UriBase = GameManager.instance.UriBaseDetect;
string requestParameters =
"returnFaceId=true&returnFaceLandmarks=true&returnFaceAttributes=age,gender,headPose," +
"smile,facialHair,glasses,hair,makeup,occlusion,accessories,blur,exposure," +
"noise&recognitionModel=recognition_02&returnRecognitionModel=false";
string jsonParameters = "{\"url\": \"" + url + "\"}";
Debug.Log(jsonParameters);
string uri = UriBase + "?" + requestParameters;
using (UnityWebRequest request = UnityWebRequest.Post(uri, jsonParameters))
{
request.method = UnityWebRequest.kHttpVerbPOST;
request.SetRequestHeader("Ocp-Apim-Subscription-Key", azurKey);
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.isNetworkError)
Debug.Log("Network = : " + request.downloadHandler.text);
if (request.isHttpError)
Debug.Log("Http = : " + request.downloadHandler.text);
}
}
void Start()
{
StartCoroutine(giveTempFaceId("http://psycho2rue.fr/wp-content/uploads/2015/01/visage9-e1345982192269.jpg"));
}
使用 UnityWebRequest,我有以下错误:
{"error":{"code":"BadArgument","message":"JSON 解析错误。"}}
我不明白为什么,因为我对两个样本使用了相同的 Json。
我认为问题可能来自request.SetRequestHeader("Content-Type", "application/json");
但我不明白我的代码有什么问题......
编辑: 问题是 UnityWebRequest 对数据进行编码(感谢 derHugo!)
数据将在传输前进行 URL 编码
现在我的问题是“我们可以简单地对 Post 方法说不要编码吗?” 或者我需要创建一个像this 这样的自定义请求?
【问题讨论】:
-
非常感谢,现在我明白了问题所在,但是您认为可以保留 Post 方法并告诉 unity 不要编码吗?
-
是的...请参阅我评论中的最后一个链接。
UnityWebRequest.Post与那里的方法基本完全相同。唯一的区别是它已经附加了另一种自动处理该编码的上传和下载处理程序。 -
呵呵,好的,我现在明白了,非常感谢!
-
嗨@derHugo 请添加您的评论作为答案,因为它将帮助其他有相同问题的人