【问题标题】:Why i can't send post request to Azur Face Vision with UnityWebRequest but's is work with HttpClient?为什么我不能使用 UnityWebRequest 向 Azur Face Vision 发送发布请求,但可以使用 HttpClient?
【发布时间】: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 这样的自定义请求?

【问题讨论】:

  • 问题可能是postData Form body data. Will be URLEncoded prior to transmission. (source) 所以也许你不必使用UnityWebRequest.Post,而是手动配置一个“正常”UnityWebRequest。例如喜欢this
  • 非常感谢,现在我明白了问题所在,但是您认为可以保留 Post 方法并告诉 unity 不要编码吗?
  • 是的...请参阅我评论中的最后一个链接。 UnityWebRequest.Post 与那里的方法基本完全相同。唯一的区别是它已经附加了另一种自动处理该编码的上传和下载处理程序。
  • 呵呵,好的,我现在明白了,非常感谢!
  • 嗨@derHugo 请添加您的评论作为答案,因为它将帮助其他有相同问题的人

标签: c# azure unity3d


【解决方案1】:

问题可能出在

发布数据
表单正文数据。将在传输之前进行 URLEncoded。 (from 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); 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多