C/C libcurl如何POST表单提交,只是普通的web表单提交数据

     2023-03-15     87

关键词:

【中文标题】C/C libcurl如何POST表单提交,只是普通的web表单提交数据【英文标题】:C / C libcurl how to POST form submission, just ordinary web form submission data 【发布时间】:2020-06-23 01:04:16 【问题描述】:

我想模拟web表单提交到PHP API,但是失败了,我尝试了很多方法。 我的代码

#define HADES "Content-Type:application/x-www-form-urlencoded;charset=utf-8"

int SendPacket(char *packet, const char *server)

    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();
    if (!curl) 
        return -1;
    
    CURLcode ret;
    struct curl_slist *haderlist = NULL;
    struct curl_httppost *post = NULL;
    struct curl_httppost *last = NULL;
    haderlist = curl_slist_append(haderlist, HADES);

    curl_formadd(&post, &last, CURLFORM_COPYNAME, "username",
             CURLFORM_COPYCONTENTS,
             "11111111111", CURLFORM_END);
    curl_formadd(&post, &last, CURLFORM_COPYNAME, "password",
             CURLFORM_COPYCONTENTS,
             "111111", CURLFORM_END);
    curl_formadd(&post, &last, CURLFORM_COPYNAME, "client", CURLFORM_FILE,
             "wap", CURLFORM_END);


    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, haderlist);
    curl_easy_setopt(curl, CURLOPT_URL, server);
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);

    //SendData
    ret = curl_easy_perform(curl);
    if (ret != CURLE_OK ) 
        curl_easy_strerror(ret);

        return -1;
    
    return 0;

我把post的参数改成这个格式就可以正常发送了:username = 11111 & password = 1111 & client = wap 不用form_add函数,但是不知道怎么做. 如何纠正这个问题?我不知道

【问题讨论】:

【参考方案1】:

您正在混合表单编码。 CURLOPT_POSTFIELDS 需要 URL 编码形式(例如 username = 11111&password =1111&client=wap),而 curl_formadd 生成 multipart/form-data 编码形式。将CURLOPT_HTTPPOST 与curl_formadd 一起使用,或者在url 编码的表单上使用CURLOPT_POSTFIELDS

在任何一种情况下,您都不需要添加 Content-Type 标头,因为它会自动添加。

【讨论】:

但我觉得主要不是这个造成的。我试图删除 curl_slist_append (haderlist, HADES) 函数,仍然无法正常解析【参考方案2】:
 tried to use mime to successfully solve the code as follows

int SendPacket(char *packet, const char *server)

    curl_global_init(CURL_GLOBAL_ALL);
    CURL *curl = curl_easy_init();
    if (!curl) 
        return -1;
    
    CURLcode ret;

    curl_mime *mime;
    curl_mimepart *part1;
    curl_mimepart *part2;
    curl_mimepart *part3;

    mime = curl_mime_init(curl);
    part1 = curl_mime_addpart(mime);
    part2 = curl_mime_addpart(mime);
    part3 = curl_mime_addpart(mime);

    //Add part to the mime handle, each of which is a pair of key(name)value(data)
    curl_mime_data(part1, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part1,"username");
    curl_mime_data(part2, "111111", CURL_ZERO_TERMINATED);
    curl_mime_name(part2, "password");
    curl_mime_data(part3, "wap", CURL_ZERO_TERMINATED);
    curl_mime_name(part3, "client");

    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
    curl_easy_setopt(curl, CURLOPT_URL, server);    
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);

    ret = curl_easy_perform(curl);
    if (ret != CURLE_OK ) 
        curl_easy_strerror(ret);

        return -1;
    
    return 0;


Above is mock to simulate web form submission

【讨论】:

如何在 POST 表单上设置 Header 字段?

】如何在POST表单上设置Header字段?【英文标题】:HowtosetaHeaderfieldonPOSTaform?【发布时间】:2012-03-1923:40:19【问题描述】:如何在提交表单时在POST标头中设置自定义字段?【问题讨论】:你的意思是使用XmlHttpRequest?还是只是一个... 查看详情

提交表单时如何打印所有 POST 结果? [复制]

】提交表单时如何打印所有POST结果?[复制]【英文标题】:HowdoIprintallPOSTresultswhenaformissubmitted?[duplicate]【发布时间】:2012-03-0902:47:50【问题描述】:我需要查看所有提交到服务器进行测试的POST结果。什么是我如何创建一个新文... 查看详情

如何使用jquery $.post() 方法提交表单值[重复]

】如何使用jquery$.post()方法提交表单值[重复]【英文标题】:Howtousejquery$.post()methodtosubmitformvalues[duplicate]【发布时间】:2014-11-1022:29:08【问题描述】:我有一个带有表单的主页和另一个用于处理表单值的页面这是2页的源代码表单... 查看详情

c/c++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)

 C++要实现http网络连接,需要借助第三方库,libcurl使用起来还是很方便的环境:win32+vs2015如果要在Linux下使用,基本同理 1,下载编译libcurl下载curl源码,找到vs工程,按照x86x64并对应debug和release编译出静态库lib 2,构... 查看详情

c/c++怎么实现post数据提交?

...llUSE_SSSPI=noENABLE_IDN=no编译成功后cd..\builds到一个名字为libcurl-....lib的子目录里找到libcurl.dll和libcurl.lib,保存到一个目录下备份,下面要用。3.打开vc++2010,File->Newproject,选Win32Project,输入一个项目名。下面点Next,勾上ConsoleApplicati... 查看详情

当引导验证成功时,如何使用 $.post 提交表单而不进行页面重定向?

】当引导验证成功时,如何使用$.post提交表单而不进行页面重定向?【英文标题】:howtosubmitformusing$.postwithoutpageredirectionwhenbootstrapvalidationissuccess?【发布时间】:2015-07-3017:35:06【问题描述】:使用引导验证器;验证成功提交表单... 查看详情

asp.net如何把表单提交到别的页面而不是本页面,用post方式

如题,请大侠们帮忙一下用了html的form了,但这样一来总是显示“回发或回调参数无效”的错误get方式,显示传值。post方式,隐式传值首先,这两种方式都可以提交到别的页面啊。只是有些细微差别。比如,前边你填写了一个表... 查看详情

Rails Tutorial 7.4.4 - post 方法如何提交带有真实性令牌的表单?

】RailsTutorial7.4.4-post方法如何提交带有真实性令牌的表单?【英文标题】:RailsTutorial7.4.4-Howdoespostmethodsubmitformwithauthenticitytoken?【发布时间】:2015-01-2615:43:12【问题描述】:我在RailsTutorial7.4.4,我很好奇以下测试帖子表单中的post_... 查看详情

如何在提交侦听器上传递表单数据,以便 axios 可以发布表单数据?

】如何在提交侦听器上传递表单数据,以便axios可以发布表单数据?【英文标题】:Howtopassformdataonsubmitlistenersothataxioscanpostformdata?【发布时间】:2020-09-1022:09:30【问题描述】:我有如下表格。<formclass="comment-post"method="POST"action="... 查看详情

JSF 2.0;我的脸;仅使用 POST 提交表单

...7-3103:13:12【问题描述】:我有一个安全问题,但我不知道如何在JSF中执行此操作。在PHP中,我可以对定义为POST的表单提交做出反应,我只想通过POST获取值,因此无法通过GET从同名字段获取值。示例:表单中的字段名:用户名在... 查看详情

html表单

空间的id属性只是用于js和css使用,在表单提交的时候不起作用。name属性作为和服务器通信时使用的key表单提交的方式有post和get两种。form用于创建一个表单,可以包含input,menus,textarea,fieldset,legend,label元素。表单用于向服务器传... 查看详情

如何使用 http.post 上传文件和表单数据

】如何使用http.post上传文件和表单数据【英文标题】:Howtouploadafilealongwithformdatausinghttp.post【发布时间】:2018-03-0810:54:20【问题描述】:我正在使用http.post提交包含title和description等字段的表单,它工作正常。我还允许用户使用相... 查看详情

如何在提交前向表单添加其他字段?

】如何在提交前向表单添加其他字段?【英文标题】:Howtoaddadditionalfieldstoformbeforesubmit?【发布时间】:2013-07-2210:56:33【问题描述】:有没有办法使用javascript和JQuery添加一些额外的字段以使用POST从HTTP表单发送?我的意思是:<f... 查看详情

如何根据单击的提交按钮选择父表单?

】如何根据单击的提交按钮选择父表单?【英文标题】:HowdoIselecttheparentformbasedonwhichsubmitbuttonisclicked?【发布时间】:2010-09-2314:51:01【问题描述】:我有一个网页,上面有3个表单。没有嵌套,只是一个接一个(它们几乎相同,只... 查看详情

c++用libcurl通过http以表单的方式post数据到服务器(代码片段)

POST字符串#include<stdio.h>#include<curl/curl.h>intmain(void)CURL*curl=NULL;CURLcoderes;curl=curl_easy_init();if(curl==NULL)returnCURLE_FAILED_INIT;structcurl_slist*headerlist=NULL;//设置表头, 查看详情

表单post提交普通字段和提交附件传输的区别

今天突然被问到这个问知题,竟然不知道怎么说清楚。于是用java写了一个servlet测试一下,如下图所示。表单post方式提交普通字段:表单post提交附件:另附:表单GET提交普通字段:表单GET提交附件: 查看详情

如何使用 Django 模板在 HTML 表单操作中向“current_url”/submit 提交 POST 请求?

】如何使用Django模板在HTML表单操作中向“current_url”/submit提交POST请求?【英文标题】:HowtosubmitPOSTrequestto\'"current_url"/submit\'inHTML\'sformactionusingDjangotemplates?【发布时间】:2015-07-1612:15:48【问题描述】:假设我有很多帖子... 查看详情

提交表单时,DJANGO 中的 POST 方法返回“None”

...获特定的单元格值时,它不会返回任何值。有人可以帮我如何从我 查看详情