86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
1
.NET 4.x

Как передать кириллические символы post запросом через HttpClient?

21.11.2019, 18:01. Показов 7722. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!

Есть такой код:

C#
1
2
3
4
5
6
7
var formVariables = new List<KeyValuePair<string, string>>();
formVariables.Add(new KeyValuePair<string, string>("UserName", "Вася"));
formVariables.Add(new KeyValuePair<string, string>("PassWord", "123"));
var formContent = new FormUrlEncodedContent(formVariables);
 
HttpClient client = new HttpClient();
var response = await client.PostAsync(url, formContent);
В конечном счете на сервер отправляется запрос вида UserName=%D0%92%D0%B0%D1%81%D1%8F&PassWord=123

Как сделать, что бы передавалось UserName=Вася&PassWord=123?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2019, 18:01
Ответы с готовыми решениями:

Соединиться с формой на сайте POST запросом Apache HttpClient 4.5.1
Недавно изучаю java и в частности работу с http. Задача: нужно послать POST запрос с логином и...

Как передать cookie с post запросом?
Привет , вот есть такой код string uri = &quot;сайт&quot;; HttpWebRequest...

Как передать файл POST запросом?
Проблема именно в файле, не знаю как его подставить ... Пробовал так: TIdMultiPartFormDataStream...

Не получается залогиниться на сайт (POST через HttpClient)
Всем здравствуйте. Пытаюсь залогиниться на joyreactor.cc Опыта в таких вещах нет, поэтому как...

11
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,485
21.11.2019, 18:12 2
Для начала нужно определиться с кодировкой...
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
21.11.2019, 19:26 3
Не понятно какой тип данных принимает сервер там. Если json, то вообще нитак. Если данные формы, то надо юзать NameValueCollection()

а русские буквы переводит, потому что написал вот это FormUrlEncodedContent
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
22.11.2019, 13:36  [ТС] 4
Someone007, windows-1251

yurickas, я не правильно сформулировал вопрос в 1 сообщении. Русские буквы переводить таки надо, но надо следующим образом.

Исходные данные: UserName = Вася, PassWord = 123.
Отправить нужно строку вида: UserName=%C2%E0%F1%FF&PassWord=123

Вариант описанный в 1 сообщении отправляет не совсем то. Пробовал ещё вот так:

C#
1
2
3
string postData = $"UserName={login}&PassWord={password}";
HttpClient client = new HttpClient();
var response = await client.PostAsync(LoginUrl, new StringContent(postData, Encoding.GetEncoding("windows-1251")));
Но это тоже не то, что хотелось бы. В таком случае отправляет UserName=Вася&PassWord=123.

Как UserName = Вася, PassWord = 123 закодировать в строку UserName=%C2%E0%F1%FF&PassWord=123?
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
22.11.2019, 13:51 5
Лучший ответ Сообщение было отмечено V0fka как решение

Решение

V0fka,

.. на stackoverflow пишут:

FormUrlEncodedContent class encode form data in utf8 encoding.
try ByteArrayContent class and HttpUtility.UrlEncode(String, Encoding) to encode.
1
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
22.11.2019, 14:28 6
Цитата Сообщение от V0fka Посмотреть сообщение
Исходные данные: UserName = Вася, PassWord = 123.
Отправить нужно строку вида: UserName=%C2%E0%F1%FF&PassWord=123

Uri.EscapeUriString(string)
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
22.11.2019, 17:39  [ТС] 7
carrotik,
C#
1
2
3
4
string postDataEncoded = HttpUtility.UrlEncode(postData, Encoding.GetEncoding("windows-1251"));
byte[] bytes = Encoding.GetEncoding("windows-1251").GetBytes(postData);
var byteArrayContent = new ByteArrayContent(bytes);
var response = await client.PostAsync(LoginUrl, byteArrayContent);
отправляет:
UserName= &PassWord=123
(значение UserName отображается в виде 4 прямоугольничков, при вставке сюда заменяет эти символы на пробелы)

Цитата Сообщение от yurickas Посмотреть сообщение
Uri.EscapeUriString(string)
C#
1
var response = await client.PostAsync(LoginUrl, new StringContent(Uri.EscapeUriString(postData), Encoding.GetEncoding("windows-1251")));
и
C#
1
var response = await client.PostAsync(LoginUrl, new StringContent(Uri.EscapeUriString(postData)));
отправляет такой результат
UserName=%D0%92%D0%B0%D1%81%D1%8F&PassWord=123
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,485
22.11.2019, 17:48 8
А так?
C#
1
2
3
4
string postDataEncoded = HttpUtility.UrlEncode(postData, Encoding.GetEncoding("windows-1251"));
byte[] bytes = Encoding.GetEncoding("windows-1251").GetBytes(postDataEncoded);
var byteArrayContent = new ByteArrayContent(bytes);
var response = await client.PostAsync(LoginUrl, byteArrayContent);
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
22.11.2019, 18:28  [ТС] 9
Someone007,
что-то схожее с результатом есть, но не совсем то:
UserName%3d%c2%e0%f1%ff%26PassWord%3d123
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
22.11.2019, 18:36 10
..если уж так сильно надо, может, проще забить два статических массива с символами подстановки ... неэстетично, зато надёжно ...
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,485
22.11.2019, 18:48 11
Лучший ответ Сообщение было отмечено V0fka как решение

Решение

Ну а так тогда?
C#
1
2
3
4
5
6
string login = "Вася";
string password = "123";
string loginEncoded = HttpUtility.UrlEncode(login, Encoding.GetEncoding("windows-1251"))
byte[] bytes = Encoding.GetEncoding("windows-1251").GetBytes($"UserName={loginEncoded}&PassWord={password}");
var byteArrayContent = new ByteArrayContent(bytes);
var response = await client.PostAsync(LoginUrl, byteArrayContent);
2
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
25.11.2019, 13:23  [ТС] 12
Someone007, то что надо, спасибо!
0
25.11.2019, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2019, 13:23
Помогаю со студенческими работами здесь

Передать данные из js post запросом
Доброго времени суток, прошу помощи, необходимо передать данные из js скрипта пост запросом...

Как методом post передать данные не через submit, а через ссылку?
У меня сейчас выводится кнопка с ником, при нажатии на которую выводится подробная информация о...

Какую часть куков надо вытащить чтобы передать с POST запросом?
Здравствуйте. При get запросе получаю куки,но их много,что именно отправлять,чтобы сайт узнавал...

Как достать кириллические символы из char*
Добрый день. Использую библиотеку, которая возвращает строку в char*. Если создавать std::wstring...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru