Установить кодировку UTF-8 на Azure Функции Http Trigger - PullRequest
0 голосов
/ 07 апреля 2020

EDIT Только в случае, если им ошибочный диагноз, вот пример того, что посылается: T6NLmFUZdYYdvhxmq67WD / TiShKbE0rK0xdHXJGo5sVx9 / CrmBTViiQxjqLEQN66HkAUB9LvXW6C55maPLMd7u2cwNc8OlNuPTvZfx63Aawso / 2mvewXQauUytGZ1Q8D

1004 * А что получил: T6NLmFUZdYYdvhxmq67WD% 2fTiShKbE0rK0xdHXJGo5sVx9% 2fCrmBTViiQxjqLEQN66HkAUB9LvXW6C55maPLMd7u2cwNc8OlNuPTvZfx63Aawso% 2f2mvewXQauUytGZ1Q8D

'% 2' вместо backsla sh является лучшим примером того, о чем я говорю

EDIT2 Для тех, кто придет после: обработчик загрузки raw сделал трюк и исправил это. Однако если вы хотите получить доступ к ответу сервера, вам нужно создать обработчик загрузки. Для текста используйте DownloadHandlerBuffer, например,

www.downloadHandler = new DownloadHandlerBuffer();

Затем, после отправки запроса, используйте его для получения строкового ответа:

string response = System.Text.Encoding.UTF8.GetString(www.downloadHandler.data);

Я отправляю вызов REST с помощью UnityWebRequest Unity, для функций Azure функции типа HttpTrigger.

Теперь обе эти функции не предоставляют байты, они делают это в бэкэнде и передают мне строки. Однако, когда моя функция получает мои данные, они содержат много экранированных символов, и я считаю, что они не закодированы должным образом. Я не уверен, КАК правильно его кодировать, учитывая, что я не могу просто преобразовать свою строку в байт [] с UTF8.GetBytes, и наоборот.

Извиняюсь, если дублировал, я искал и не мог найти достаточно похожую проблему.

См. Unity и azure код здесь: https://pastebin.com/pE4dYSfF

//UNITY SIDE
IEnumerator Foo()
    {
        var N = JSON.Parse("{}");
        N["input1"] = input1.text;
        N["input2"] = input2.text;
        string encrypted = Encrypt(N.ToString(), GenerateEncryptionKey);

        print("ENSEND: \n" + encrypted);
        using (UnityWebRequest www = UnityWebRequest.Post(targetURL, encrypted))
        {
            yield return www.SendWebRequest();

            if (www.isHttpError || www.isNetworkError)
            {
                Debug.LogError(www.error + "\n" + www.downloadHandler.text);
                onFail?.Invoke();
            }
            else
            {
                onSuccess?.Invoke();
                print(www.responseCode + " : " + www.downloadHandler.text);
            }

        }
        yield break;
    }

//FUNCTION SIDE 
[FunctionName("UserAuthentication")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            try
            {
                requestBody = Decrypt(requestBody, "Dracon");
            } catch (Exception e)
            {
//Throwing exception here due to escaped characters
                return new BadRequestObjectResult(e.Message + "\n" + requestBody + "\n" + Regex.Unescape(requestBody));
            }

            JSONNode N = null;
            try
            {
                N = JSON.Parse(requestBody);
                if (N["input1"] != "")
                {
                    name = N["username"];
                    return (ActionResult)new OkObjectResult($"Hello, {name}");
                } else if (name != "")
                {
                    return (ActionResult)new OkObjectResult($"Hello, {name}");
                } else
                {
                    return new BadRequestObjectResult("Invalid object syntax");
                }
            } catch (Exception e)
            {
                return new BadRequestObjectResult("Invalid JSON provided. N = " + (N != null).ToString() + "\n" + requestBody + "\n" + e.Message);
            }
        }

1 Ответ

0 голосов
/ 07 апреля 2020

Я вижу, что есть функция Encrypt на вашей стороне Unity и функция Decrypt на вашей стороне Azure.

Итак, вам нужно выяснить, все ли зашифрованное содержимое было обычными символами. Если они были обычными символами, вы можете попытаться установить Content-Type следующим образом:

using (UnityWebRequest www = UnityWebRequest.Post(targetURL, encrypted))
{
    www.SetRequestHeader("Content-Type", "text/plain; charset=UTF-8");
    yield return www.SendWebRequest();

    if (www.isHttpError || www.isNetworkError)
    {
        Debug.LogError(www.error + "\n" + www.downloadHandler.text);
        onFail?.Invoke();
    }
    else
    {
        onSuccess?.Invoke();
        print(www.responseCode + " : " + www.downloadHandler.text);
    }

}

www.SetRequestHeader("Content-Type", "text/plain; charset=UTF-8"); гарантирует, что все байты будут закодированы в utf-8.

Однако, если были какие-то специальные символы, я предлагаю вам установить Content-Type как application/octet-stream. Таким образом, функция Azure сохранит для вас все байты тела запроса.


Использование UploadHandlerRaw

using (UnityWebRequest www = new UnityWebRequest(url,"POST"))
{
    byte[] body = Encoding.UTF8.GetBytes(encrypted);
    www.uploadHandler = new UploadHandlerRaw(body);
    www.SetRequestHeader("Content-Type", "text/plain; charset=UTF-8");
    yield return www.SendWebRequest();

    if (www.isHttpError || www.isNetworkError)
    {
        Debug.LogError(www.error + "\n" + www.downloadHandler.text);
        onFail?.Invoke();
    }
    else
    {
        onSuccess?.Invoke();
        print(www.responseCode + " : " + www.downloadHandler.text);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...