Размещение акцентированных символов в .netcore2.1 web-api - PullRequest
0 голосов
/ 11 января 2019

Я делаю web-api в .net core 2.1 (C #) и у меня возникают проблемы с отправкой акцентированных символов в запросе POST.

До сих пор я пробовал два разных подхода: создание контента, который будет публиковаться с использованием FormUrlEncodedContent и StringContent. Я использовал ссылки из https://pt.stackoverflow.com/questions/121713/applicationx-www-form-urlencoded-com-httpwebrequest (на португальском). Наверное, у меня проблемы с кодировкой UTF-8 по какой-то причине.

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

        var values = new List<KeyValuePair<string, string>>();
        object[] myKeys = new object[content.DsValues.Count];
        object[] myValues = new object[content.DsValues.Count];

        content.DsValues.Keys.CopyTo(myKeys, 0);
        content.DsValues.Values.CopyTo(myValues, 0);

        foreach (object value in myValues)
        {
            values.Add(new KeyValuePair<string, string>("value", value.ToString()));
        }

        foreach (object key in myKeys)
        {
            values.Add(new KeyValuePair<string, string>("field", key.ToString()));
        }

        values.AddRange(content.Values);

        var string_message = new FormUrlEncodedContent(values).ReadStringAsync();

        var postRequest = Encoding.UTF8.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

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

        var formurlstring = "";
        foreach(object value in myValues)
        {
            formurlstring = formurlstring + "value=" + value.ToString() + "&";
        }

        foreach(object key in myKeys)
        {
            formurlstring = formurlstring + "field=" + key.ToString() + "&";
        }

        var encoded = formurlstring.Replace(" ", "+");
        var string_message = new StringContent(HttpUtility.UrlEncode(encoded));


        var postRequest = Encoding.UTF8.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

Насколько я проверил, строка, возвращаемая FormUrlEncodedContent, содержит уже закодированные символы ударения, в то время как строка, которую я восстанавливаю из StringContent, все еще содержит символы ударения. Я могу опубликовать оба из них во внешнем веб-приложении, но всякий раз, когда я иду проверить то, что я написал, акцентированные символы не являются правильными. Я бы ожидал что-то вроде:

COMESTÍVEL

Но всякий раз, когда я захожу, проверяю на веб-сайте то, что было опубликовано: COMESTÃVEL

Заранее спасибо за ответы и извините, если я забыл некоторую информацию о коде.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я наконец отладил его.

Итак, поскольку я работаю с ISO-8859-1, мне пришлось изменить метод кодирования на него. Всякий раз, когда я пытался создать контент для загрузки с использованием FormUrlEncodeContent или StringContent, используемый кодировщик был неправильным.

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

var formurlstring = "";
        foreach(object value in myValues)
        {
            formurlstring = formurlstring + "value=" + value.ToString() + "&";
        }

        foreach(object key in myKeys)
        {
            formurlstring = formurlstring + "field=" + key.ToString() + "&";
        }

        var string_message = formurlstring.Replace(" ", "+");

        var enc8859 = Encoding.GetEncoding(28591);
        var postRequest = enc8859.GetBytes(string_message);
        request.ContentLength = postRequest.Length;
        var stream = request.GetRequestStream();
        stream.Write(postRequest, 0, postRequest.Length);
        stream.Close();

Возможно, есть лучший способ сделать это. Я действительно хотел использовать его с FormUrlEncodedContent, который намного проще и чище, но так как я не смог ...

0 голосов
/ 11 января 2019

Убедитесь, что заголовок Content-Type для вашего почтового запроса имеет тип mime с включенным charset=UTF-8. Прямо сейчас это интерпретируется как ASCII (латиница-1).

...