html - Libcurl C++ - 如何发布此特定表单的表单数据?

标签 html c++ forms libcurl fieldset

如何使用 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);
    }

最佳答案

您正在泄漏 curl 对象。您需要调用curl_easy_cleanup()当您用完它时。

但是,更重要的是,您正在使用 CURLOPT_POSTFIELDS不正确。您正在向它传递一个指向临时 std::stringchar* 指针,该指针立即超出范围,到 curl_easy_perform() 被调用。你需要要么

您还需要对您发布的表单参数进行 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);
    }
}

关于html - Libcurl C++ - 如何发布此特定表单的表单数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575956/

相关文章:

javascript - 如何将div变成按钮?

c++ - 如何在 lambda 的 lambda 函数中捕获 "this"?

c++ - 使用 C++ 记录本地化的最佳方法

jQuery 抓取动态文本区域的值

jquery - 单击复选框时更改div的背景颜色

html - 更改输入标签上 "Submit"的文本

javascript - 需要帮助使用 Javascript 设置表格高度中的 div

python - BeautifulSoup 无法工作,出现 NoneType 错误

c++ - udp(boost::asio)在async_receive_from之后读取错误

jQuery 单选按钮、标签、更改和单击事件