51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
1

Кодировка в теле POST-запроса (idHTTP)

20.09.2018, 17:47. Показов 2891. Ответов 2

Добрый день.
Помогите люди добрые, уже не знаю куда бежать, весь инет перерыл.
Вот простенький код:
C++
1
2
3
4
5
6
TStringStream * str;
String result;
str = new TStringStream();
str->WriteString("{\"FIO\": \"петров петр петрович\"}");
result=IdHTTP1->Post("http://***********",str);
delete str;
У idHTTP заменил следующие параметры:
Accept: */*
ContentType: application/json
UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

Суть в том, что мне надо в теле POST-запроса передать кириллицу. Но в результате уходят знаки вопроса. Вот что WireShark ловит:
JavaScript Object Notation: application/json
Object
Member Key: FIO
String value: ?????? ???? ????????
Key: FIO

Пробовал всякие кодировки перенастраивать и у исходного текста, и в параметрах idHTTP - но ничего не помогает.

Добавлено через 3 часа 36 минут
Пробовал не через idHTTP, а с помощью libcurl. Сгенерил lib из dll путем implib. Скомпилировал, но при запуске программа вылетает. Так и не разобрался почему.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2018, 17:47
Ответы с готовыми решениями:

Отправка POST запроса компонентом IdHTTP
Здравствуйте! Решаю простенькую задачку! Есть файл index.php. Там описана форма, состоящая из...

idHTTP.post и кодировка UTF-8
Здравствуйте!!! У меня проблема, которую не могу решить, заключается она вот в чём: Мне нужно...

Передать JSON в теле POST запроса?
Хочу подключиться к сайту но не могу понять как предавать json в post запросе? где это можно...

Http POST отправка файла в теле запроса
Всем привет! Пытаюсь отправить файл на сервер, но со стороны сервера мне говорят, что нужно...

2
случайный прохожий
1516 / 1018 / 374
Регистрация: 20.07.2013
Сообщений: 2,955
21.09.2018, 02:54 2
Попробуй к тексту перед отправкой применить функцию UTF8ToString

Можно еще поиграться с параметрами:
C++
1
2
3
4
5
HTTP->Request->Accept = "application/json, text/javascript, */*; q=0.01";
HTTP->Request->UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0";
HTTP->Request->ContentType = "application/json";
HTTP->Request->AcceptLanguage = "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
HTTP->Request->AcceptEncoding = "gzip, deflate, br";
Добавлено через 20 минут
Хотя вру насчет UTF8ToString, тут нужна функция UTF8String или UTF8Encode:
C++
1
result=IdHTTP1->Post("http://***********",UTF8String(str->DataString));
1
51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
21.09.2018, 04:46  [ТС] 3
Сделал как ты сказал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TStringStream * str;
AnsiString result;
str = new TStringStream();
 
IdHTTP1->Request->Accept="application/json, text/javascript, */*; q=0.01";
IdHTTP1->Request->UserAgent="Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0";
IdHTTP1->Request->ContentType = "application/json";
IdHTTP1->Request->AcceptLanguage = "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
IdHTTP1->Request->AcceptEncoding = "gzip, deflate, br";
 
str->WriteString("{\"FIO\": \"петров петр петрович\"}");
result=IdHTTP1->Post("http://***********",UTF8String(str->DataString));
delete str;
На строчке
C++
1
result=IdHTTP1->Post("http://***********",UTF8String(str->DataString));
выдает ошибку, что не может найти файл "{"FIO": "петров петр петрович"}".
Если вторым параметром у Post идет строка, то это должен быть путь к файлу.
Пробовал сделать
C++
1
str->WriteString(UTF8String("{\"FIO\": \"петров петр петрович\"}"));
тоже не помогло.

Добавлено через 11 минут
Счастью моему предела нет!!!!!!!!
Убил на это три дня и путем перебора всего подряд нашел решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    TStringStream * str;
    AnsiString result;
 
    str = new TStringStream("{\"FIO\": \"петров петр петрович\"}",TEncoding::UTF8,true);
 
    IdHTTP1->Request->Accept="application/json, text/javascript, */*; q=0.01";
    IdHTTP1->Request->UserAgent="Mozilla/5.0 (Windows NT 6.1; rv:57.0) Gecko/20100101 Firefox/57.0";
    IdHTTP1->Request->ContentType = "application/json";
    IdHTTP1->Request->AcceptLanguage = "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3";
    IdHTTP1->Request->AcceptEncoding = "gzip, deflate, br";
 
    result=IdHTTP1->Post("http://***********",str);
    delete str;
gunslinger, спасибо за наводку в сторону UTF-8 !!


Добавлено через 3 минуты
надо было просто добавить эти параметры TEncoding::UTF8,true при создании TStringStream! )
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2018, 04:46

Requests: gzip данные в теле POST запроса
Всем привет. Есть protobuf сообщение (Content-Type="application/x-protobuf"). Его нужно отослать в...

Ошибка при отправке post запроса idhttp
help!!!отправляю запрос авторизации в базу данных. ругается на строчку: ...

Ошибка при отправке POST Запроса через idhttp
форма: нажимаю "авторизоваться" и тут: код: res:string; params:tstringlist;

Кодировка POST запроса Indy
PostData := TStringList.Create; PostData.Clear; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.