POST запрос и массив?

Здравствуйте, нужно вручную на с++ составить пост-запрос и отправить. Он должен включать в себя массив чисел. Вот в этом и проблема:



int *binary = new int[bufferLength];<br>
...<br>
<br>
std::string data;<br>
std::stringstream out(data);<br>
out << "POST /push1_pub?id=game\r\n";<br>
out << "Host: http://localhost\r\n";<br>
out << "Content-Length: ";<br>
out << bufferLength << "\r\n";<br>
out << "\r\n";<br>
out << reinterpret_cast<char*>(binary);<br>
<br>
if (socket.send(data.c_str(), data.size()) == -1)<br>
{<br>
    std::cout << "Failed to send headers\n";<br>
}<br>
else<br>
{<br>
   // Получаю ответ от сервера<br>
}<br>




Не могу понять, как правильно передать массив int-элементов, какой размер в Content-Length указывать. В коде, что я показал, сервер не отвечает, судя по всему, ждет еще информации. Если убрать приведение к char*, то всегда Bad Request.



Подскажите, пожалуйста.
  • Вопрос задан
  • 3857 просмотров
Решения вопроса 1
Riateche
@Riateche
Во-первых, при таком подходе могут быть проблемы с кодировкой. Не любые символы можно писать в теле запроса, всё зависит от Content-encoding. Но точно не знаю, надо пробовать.

Самым надежный способ — честно преобразовать все числа в строки и эти строки записать в запрос, разделяя, например, пробелом. Не знаю, подходит ли это решение к вашей задаче, но так будет проще и проверять корректность запроса, и принимать данные на сервере.

Если же делать, как вы пытаетесь (записать в запрос байты, которыми представляются целые числа), то записывать в строку нужно так:

out.write(reinterpret_cast<char*>(binary), bufferLength*sizeof(int));

Тогда запишется массив целиком. А у вас получается, что байты пишутся до тех пор, пока не встретится нулевой байт. А в представлении int-а нулевые байты встречаются часто. В Content_length нужно указать количество байт в теле запроса, т.е. bufferLength*sizeof(int).
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Melkij
@Melkij
PostgreSQL DBA
Я немного совсем не знаю плюсы, но вы уверены, что reinterpret_cast указателя на массив реинтерпретирует весь массив, а не только первый элемент? И при том опять же весь массив запишется в поток?

Сделайте std::cout << data; посмотрите, что записалось в поток и с каким content-length
Ответ написан
Комментировать
barker
@barker
Очевидно, что длина в поле Content-Length никак не может задаваться в каких-то там абстрактных размером int-ах, как у вас. Задаётся в байтах. Почитайте длину вывода, на sizeof(int) умножьте, или как-то так. И почему старт-строка не по стандарту, может, потому и Bad Request?
Ответ написан
Monnoroch
@Monnoroch
Вот это:
out << reinterpret_cast<char*>(binary);

Записывает в поток указатель на char*. Не массив. Указатель.
Чтобы записывало массив, надо в цикле выводить элементы.
Не уверен, но может можно так:
out << std::string(reinterpret_cast<char*>(binary));
Ответ написан
ixSci
@ixSci
Покажите как, и самое главное чем Вы заполняете int массив.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы