C++用libcurl通过HTTP以表单的方式Post数据到服务器

POST字符串

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL* curl = NULL;
    CURLcode res;

    curl = curl_easy_init();
    if(curl == NULL)
    {
        return CURLE_FAILED_INIT;
    }

    struct curl_slist* headerlist = NULL; 

    // 设置表头,表头内容可能不同
    headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  

    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");

    // 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

    // 设置为Post
    curl_easy_setopt(curl, CURLOPT_POST, 1);

    // 发送
    res = curl_easy_perform(curl);

    if(res != CURLE_OK)
    {
        // 获取详细错误信息
        char* szErr = curl_easy_strerror(res);
        fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
    }

    // 清空
    curl_easy_cleanup(curl);

    // 释放表头
    curl_slist_free_all (headerlist);  

    return 0;
}

POST文件

#include <stdio.h>
#include <curl/curl.h>

size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid);

int main(void)
{
    CURL* curl = NULL;
    CURLcode res;

    curl = curl_easy_init();
    if(curl == NULL)
    {
        return CURLE_FAILED_INIT;
    }

    struct curl_slist*        headerlist    = NULL;
    struct curl_httppost*    formpost    = NULL;
    struct curl_httppost*    lastptr        = NULL;
    std::string strResponse;    // 回复

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "ParamName1",
        CURLFORM_COPYCONTENTS, "ParamName1Content", CURLFORM_END);

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "ParamName2",
        CURLFORM_COPYCONTENTS, "ParamName2Content", CURLFORM_END);

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "ParamName3",
        CURLFORM_COPYCONTENTS, "ParamName3Content", CURLFORM_END);

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "registerImgs",
        CURLFORM_FILE, "C:/Image.png", CURLFORM_END);    // 设置要上传的文件

    // 设置表单参数
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

    // 设置表头,表头内容可能不同
    headerlist = curl_slist_append(headerlist, "Content-Type:application/x-www-form-urlencoded");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);  

    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");

    // 设置参数,比如"ParamName1=ParamName1Content&ParamName2=ParamName2Content&..."
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");

    // 设置为Post
    curl_easy_setopt(curl, CURLOPT_POST, 1);

    curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strResponse);
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);

    // 发送
    res = curl_easy_perform(curl);

    if(res != CURLE_OK)
    {
        // 获取详细错误信息
        char* szErr = curl_easy_strerror(res);
        fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);
    }

    // 清空
    curl_easy_cleanup(curl);

    // 释放表单
    curl_formfree(formpost);

    // 释放表头
    curl_slist_free_all (headerlist);  

    return 0;
}

size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{
    std::string* str = dynamic_cast<std::string*>((std::string *)lpVoid);
    if( NULL == str || NULL == buffer )
    {
        return -1;
    }

    char* pData = (char*)buffer;
    str->append(pData, size * nmemb);
    return nmemb;
}

原文地址:https://www.cnblogs.com/liuzhenbo/p/11053531.html

时间: 2024-10-10 16:06:45

C++用libcurl通过HTTP以表单的方式Post数据到服务器的相关文章

以form表单重用方式进行数据列表行删除

〇.使用框架与技术 后:Java.Spring Boot: 前:JQuery. 一.需求 1.当我们在页面点击每行的删除按钮时,需要服务端进行数据库操作,此时得通过form表单向服务端提交一个http请求. 2.我们当然可以把整个列表套在一个form表单里.但又由于某些原因,不能把列表套在form表单中. 3.并且我们又不想把form表单一个个写在每行的删除按钮下. 二.解决 利用JQuery按钮点击事件使得form表单重用. 1.写一个form表单(注意要有id) 1 <!-- 2 this

表单的方式 Java

采用传统的表单提交,提交到后台以后一般都是要跳转到新的页面 <form id="smsForm" action="${base}/xxx/xxxx" method="post"> <label>手机号码:</label> <input type="text" id="mobile" name="mobile"/> <label>

中文乱码又一解决方法:将表单提交方式由get改为post

当把所有牵涉到的都改为utf-8时,依然有乱码.后来在网站上求助,滄海一夢 给出了这个解决方案:将表单提交方式由get改为post,果然成功.谢过! 1.filter/comments.jsp: <%@ page language ="java" import="java.util.*" pageEncoding="UTF-8" %> <% String path = request.getContextPath(); Stri

解决表单GET提交后台数据乱码问题

?在页面上提交数据到服务器有两种方式"GET"和"POST",当使用"GET"时,传输的数据是直接拼接在URL后面的.当数据中含有对HTML来说不安全的字符例如中文时,就会被编码,一般采用的是UTF-8编码.这时URL已经被转义成相对安全的字符串.此时再经过ios-8859-1的编码方式转换成二进制的形式跟随请求头一起发送到服务器端. ?到达服务器端时,服务器也对数据进行两次解码,服务器先把数据经过ios-8859-1解码,然后根据服务器默认的编

asp.net MVC中控制器获取表单form提交的数据之实体类数据

第一次写记录文章,难免有不足之处:欢迎指出. 1.新建一个mvc项目如: 2.新建一个Test.cs 注意get,set方法不能简写 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using System; using System.Collections.Generic; using System.Linq; usi

Jquery表单提交方式

1.使用调用submit方法 function tes1(){ //执行判断 if(校验通过){ $("#formId").submit(); }else{ return; } } 2.使用ajaxSubmit 方法,用到jquery.form.js $("#picForm").ajaxSubmit({ type: "post", dataType: "text", success: function(result){ ale

c#_表单处理方式

阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Ajax方式提交整个表单 以Ajax方式提交部分表单 使用JQuery,就不要再拼URL了! id, name 有什么关系 使用C#模拟浏览器提交表单 资源链接 Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.ne

环境企业表单权限分配填报数据系统设计与实现

本科生毕业论文(设计) Undergraduate Graduation Thesis(Design) 题目Title:环境企业表单权限分配填报数据   系统设计与实现                 院 系 School (Department):数据科学与计算机学院  专 业 Major:   软件工程   学生姓名 Student Name:                     学 号 Student No.:                    指导教师(职称) Superviso

将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)

表单序列化类型的数据是指url传递的数据的格式,形如"key=value&key=value&key=value"这样的key/value的键值对.一般来说使用jQuery的$.fn.serialize函数能达到这样的效果.如何将这样的格式转化为对象? 我们知道使用jQuery的$.fn.serializeArray函数得到的是一个如下结构的对象 [ { name: "startTime" value: "2015-12-02 00:00: