html — Libcurl Как опубликовать данные формы для этой конкретной формы?

Как опубликовать, а затем отправить данные формы для следующей формы, используя libcurl и C ++?

<form id="loginContainer" class="controllerContainer" action="/j_spring_security_check" method="post">

<h2>Login</h2>
<hr>
<fieldset>

<div class="field">
<input class="standard" name="j_username" autocomplete="off" autocapitalize="off" size="25" placeholder="Enter Username">
</div>
<div class="field">
<input class="standard" name="j_password" type="password" value="" size="25" autocapitalize="off" autocomplete="off" placeholder="Enter Password (case-sensitive)">
</div>
<div class="field">
<button class="login" type="submit"></button>
</div>

</fieldset>

Я попробовал несколько примеров с сайта curl, но ни один из них не помог мне.

РЕДАКТИРОВАТЬ: Вот функция, которую я сделал для входа

void loginToWebsite(std::string url, std::string userAgent, std::string username, std::string password)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();

if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ("j_username=" + username + "&j_password=" + password).c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

res = curl_easy_perform(curl);
}

0

Решение

Вы протекаете curl объект. Вам нужно позвонить curl_easy_cleanup() когда вы закончите, используя его.

Но, что более важно, вы используете CURLOPT_POSTFIELDS неправильно. Вы передаете это char* указатель на временный std::string который сразу выходит из области видимости, оставляя завиток с висящим указателем на неверную память к тому времени curl_easy_perform() называется. Вам нужно либо

  • использовать местный std::string переменная

  • использование CURLOPT_COPYPOSTFIELDS.

Вам также необходимо URL-кодировать параметры формы, которые вы публикуете. Ты можешь использовать curl_easy_escape() для этого.

С учетом сказанного, попробуйте что-то вроде этого:

#include <string>
#include <sstream>

void loginToWebsite(const std::string &url, const std::string &userAgent, const std::string &username, const std::string &password)
{
CURL *curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1L);

std::ostringstream oss;

oss << "j_username=";
char *encoded = curl_easy_escape(curl, username.c_str(), username.length());
if (encoded)
{
oss << encoded;
curl_free(encoded);
}

oss << "&j_password=";
encoded = curl_easy_escape(curl, password.c_str(), password.length());
if (encoded)
{
oss << encoded;
curl_free(encoded);
}

std::string postdata = oss.str();
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());

curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3L);
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

CURLcode res = curl_easy_perform(curl);
// use res as needed...

curl_easy_cleanup(curl);
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]