Почему я не могу отправить запрос на публикацию в Azur Face Vision с UnityWebRequest, но он работает с HttpClient? - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над новым приложением 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!)

Данные будут кодироваться URLE перед передачей

Теперь мои вопросы: «Можно ли просто сказать методу Post не кодировать?»Или мне нужно создать пользовательский запрос, например this ?

1 Ответ

0 голосов
/ 29 апреля 2019

Проблема может быть в том, что

PostData
Форма тела данных. Будет передан URLEncoded. ( от 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); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...