Форум — Development Как отправить POST запрос на C++? 0 1 Может кто уже делал или знаете где можно посмотреть как это делать? Гуглил, ничего не нашел :/Спасибо. Ссылка
Я ничего не понял. У тебя проблемы с записью текстовых данных в TCP-сокет? DELIRIUM ☆☆☆☆☆ (12.03.13 10:58:40 MSK) Ссылка
составляешь и отправляешь, в чём проблема? Harald ★★★★★ (12.03.13 10:58:47 MSK) Показать ответ Ссылка
Ответ на: комментарий от Harald 12.03.13 10:58:47 MSK Оно, видимо, хочет libastral_namespace::send_post(mega_structure_with_cool_data_which_was_created_automatically_by_some_cpp_gods); DELIRIUM ☆☆☆☆☆ (12.03.13 11:01:53 MSK) Ссылка
И ещё раз отпишусь в этом дебильном топике. Посмотри на libcurl. DELIRIUM ☆☆☆☆☆ (12.03.13 11:02:59 MSK) Ссылка
std::string post = "POST / HTTP/1.1\r\nHost: example.com\r\n\r\n"; post+= "blablabla=123\r\n\r\n";//тут содержимое запроса, подставить по вкусу int bs = 0; while (bs < post.size()) { bs+= send(socket, post.c_str() + bs, post.size() - bs, 0); //обработку ошибок сокета прикрутить самостоятельно } //PROFIT :) Harald ★★★★★ (12.03.13 11:19:17 MSK) Показать ответ Ссылка
Гуглил, ничего не нашелПришёл сюда на форум, и беззастенчиво врёшь. Как тебе помогать после этого? http://bit.ly/W4ppbY thesame ★★★★ (12.03.13 11:23:59 MSK) Ссылка
http - это текстовый протокол, так что для отправки достаточно в строку написать правильную последовательность буковок и запихнуть это в socket->send. Последовательность можно узнать почитав : матчасть Sakura (12.03.13 14:48:30 MSK) Показать ответы Ссылка
Ответ на: комментарий от Sakura 12.03.13 14:48:30 MSK Вот отсюда и столько багов на плюсанутом коде - каждый раз когда что-то надо - пишем свой велосипед.По теме - думаю libcurl вполне подойдёт =) раз сам curl умеет POST-запросы отправлять. BattleCoder ★★★★★ (12.03.13 15:09:03 MSK) Ссылка
http://cpp-netlib.org/ вот ещё вариант/me не пробовал BattleCoder ★★★★★ (12.03.13 15:09:38 MSK) Ссылка
Ответ на: комментарий от Sakura 12.03.13 14:48:30 MSK правильная матчасть - RFC, а не ссылка на википедию Harald ★★★★★ (12.03.13 15:14:32 MSK) Показать ответ Ссылка
Ответ на: комментарий от Sakura 12.03.13 14:48:30 MSK http://tools.ietf.org/html/rfc2616 anonymous (12.03.13 15:18:38 MSK) Ссылка
http://doc-snapshot.qt-project.org/qt5-stable/qtnetwork/qnetworkaccessmanager... anonymous (12.03.13 15:34:03 MSK) Ссылка
Ответ на: комментарий от Harald 12.03.13 15:14:32 MSK для начала и это пойдет Sakura (12.03.13 16:55:27 MSK) Ссылка
#include <cstdio> #include <cstdlib> #include <cstring> #include <unistd.h> #include <curl/curl.h> struct Chunk { size_t size_; char *memory_; Chunk() : size_(0), memory_(0) {} ~Chunk() { free(memory_); } size_t add(const void *from, const size_t size, const size_t n) { const size_t diff = size * n; memory_ = static_cast<char*>(realloc(memory_, size_ + diff)); memcpy(memory_ + size_, from, diff); size_ += diff; return diff; } }; Chunk *global_chunk; class Client { Chunk chunk_; const char *uri_; CURL *handle_; public: Client(const char *uri) : uri_(uri) { global_chunk = &chunk_; curl_global_init(CURL_GLOBAL_ALL); handle_ = curl_easy_init(); } ~Client() { curl_easy_cleanup(handle_); curl_global_cleanup(); global_chunk = 0; } char* fetch() const { return fetch(0); } char* fetch(const char *post_data) const { auto callback = *[](const void *from, const size_t size, const size_t n) { return global_chunk->add(from, size, n); }; curl_easy_setopt(handle_, CURLOPT_URL, uri_); if (post_data) curl_easy_setopt(handle_, CURLOPT_POSTFIELDS, post_data); curl_easy_setopt(handle_, CURLOPT_WRITEFUNCTION, callback); curl_easy_setopt(handle_, CURLOPT_WRITEDATA, &chunk_); curl_easy_setopt(handle_, CURLOPT_USERAGENT, "curl"); const CURLcode res = curl_easy_perform(handle_); if (res != CURLE_OK) { const char *error = curl_easy_strerror(res); const char *fmt = "{\"error\":\"%s\"}"; char *result = static_cast<char*>(calloc(strlen(error) + strlen(fmt) + 1, 1)); sprintf(result, fmt, error); return result; } else { char *result = static_cast<char*>(calloc(chunk_.size_ + 1, 1)); memcpy(result, chunk_.memory_, chunk_.size_); return result; } } }; extern "C" char* get(const char *uri) { return Client { uri }.fetch(); } extern "C" char* post(const char *uri, const char *post_data) { return Client { uri }.fetch(post_data); } quasimoto ★★★★ (12.03.13 16:57:23 MSK) Показать ответ Ссылка
Ответ на: комментарий от quasimoto 12.03.13 16:57:23 MSK Хм, фигню написал, лучше как-нибудь так:#include <string> #include <curl/curl.h> class Client { const std::string uri_; std::string reply_; CURL *curl_; enum Method { GET, POST }; std::string fetch(const Method method, const std::string &data = "") const { curl_easy_setopt(curl_, CURLOPT_URL, uri_.c_str()); if (method == POST) curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, data.c_str()); curl_easy_setopt( curl_, CURLOPT_WRITEFUNCTION, *[](const char *from, const size_t size, const size_t n, std::string *to) { const size_t diff = size * n; to->append(from, diff); return diff; } ); curl_easy_setopt(curl_, CURLOPT_WRITEDATA, &reply_); curl_easy_setopt(curl_, CURLOPT_USERAGENT, "curl"); const CURLcode res = curl_easy_perform(curl_); return res == CURLE_OK ? reply_ : "{\"error\":\"" + std::string { curl_easy_strerror(res) } + "\"}"; } public: Client(const std::string &uri) : uri_(uri) { curl_global_init(CURL_GLOBAL_ALL); curl_ = curl_easy_init(); } ~Client() { curl_easy_cleanup(curl_); curl_global_cleanup(); } std::string get() const { return fetch(GET); } std::string post(const std::string &data) const { return fetch(POST, data); } }; и потом#include <iostream> int main() { std::cout << Client { "http://www.linux.org.ru/" }.get() << std::endl << Client { "http://.../..." }.post("...") << std::endl; } quasimoto ★★★★ (12.03.13 21:49:10 MSK) Показать ответы Ссылка
Ответ на: комментарий от quasimoto 12.03.13 21:49:10 MSK Client {Что за язык? anonymous (12.03.13 21:52:32 MSK) Показать ответ Ссылка
Ответ на: комментарий от anonymous 12.03.13 21:52:32 MSK Сабжевый же, в C++11 редакции. quasimoto ★★★★ (12.03.13 21:56:04 MSK) Ссылка
Ответ на: комментарий от Harald 12.03.13 11:19:17 MSK только content length забыл :-) elijah_sd ★ (12.03.13 22:00:12 MSK) Ссылка
Ответ на: комментарий от quasimoto 12.03.13 21:49:10 MSK Если уж C++, то тогда лучше curlpp. O02eg ★★★★★ (12.03.13 22:24:38 MSK) Показать ответ Ссылка
Ответ на: комментарий от O02eg 12.03.13 22:24:38 MSK Нужно moar C++ — boost, asio, cppnetlib и client().post(request(uri), data). quasimoto ★★★★ (12.03.13 23:08:01 MSK) Ссылка