Запрос POST в C++
Метод POST передает данные в теле запроса, а не в строке адреса.
В libcurl включают его опцией CURLOPT_POST,
а строку формы задают через CURLOPT_POSTFIELDS.
Тип "application/x-www-form-urlencoded"
добавляют заголовком "Content-Type".
Отправим поля и выведем ответ сервера:
#include <iostream>
#include <string>
#include <curl/curl.h>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
std::string payload = "sku=axle&count=3";
curl_slist* headers = nullptr;
headers = curl_slist_append(
headers,
"Content-Type: application/x-www-form-urlencoded"
);
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://example.com/"
);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(
curl,
CURLOPT_POSTFIELDS,
payload.c_str()
);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
std::cout << body << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}
Код ответа читают так же через
CURLINFO_RESPONSE_CODE. Для example.com
POST часто возвращает 405, но тело все равно
можно вывести:
#include <iostream>
#include <string>
#include <curl/curl.h>
size_t writeBody(
char* ptr,
size_t size,
size_t nmemb,
void* userdata
) {
auto* body = static_cast<std::string*>(userdata);
body->append(ptr, size * nmemb);
return size * nmemb;
}
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl = curl_easy_init();
std::string body;
std::string payload = "note=ship&priority=low";
curl_slist* headers = nullptr;
headers = curl_slist_append(
headers,
"Content-Type: application/x-www-form-urlencoded"
);
curl_easy_setopt(
curl,
CURLOPT_URL,
"https://example.com/"
);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(
curl,
CURLOPT_POSTFIELDS,
payload.c_str()
);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeBody);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK) {
long code = 0;
curl_easy_getinfo(
curl,
CURLINFO_RESPONSE_CODE,
&code
);
std::cout << code << "\n";
std::cout << body << "\n";
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
return res == CURLE_OK ? 0 : 1;
}
Отправьте на "https://example.com/" форму
с полями "user" равным "mia" и
"role" равным "editor".
Выведите тело ответа одной строкой.
Выведите код ответа и полное тело после POST
с одним полем "token" равным
"demo" на "https://example.com/".