为什么我无法使用 UnityWebRequest 向 Azure Face Vision 发送发布请求,但可以使用 HttpClient?



我正在开发一个新的 Unity 应用程序,它使用 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 方法说不编码吗? 或者我需要创建这样的自定义请求?

问题可能是

发布数据
表单正文数据。将在传输前进行 URL 编码。(来自UnityWebRequest.Post

因此,您不必使用UnityWebRequest.Post而是手动配置"正常"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(uri, UnityWebRequest.kHttpVerbPOST))
{
byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonParameters);
request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
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); 
}
}

最新更新