如何使用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 :(得分:1)
您正在泄漏curl
对象。使用完后,您需要致电curl_easy_cleanup()
。
但是,更重要的是,您错误地使用了CURLOPT_POSTFIELDS
。您正在向其传递指向临时char*
的{{1}}指针,该指针立即超出范围,在调用std::string
时,curl带有指向无效内存的悬挂指针。您需要
使用局部curl_easy_perform()
变量
您还需要对发布的表单参数进行url编码。您可以为此使用curl_easy_escape()
。
话虽如此,请尝试以下类似操作:
std::string