基于libcurl的GET与POST(HTTP1.1)

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

bool getUrl(char *filename)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;
    if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储
        return false;
    struct curl_slist *headers = NULL;
   // headers = curl_slist_append(headers, "Accept: Agent-007");
    curl = curl_easy_init();    // 初始化
    if (curl)
    {
        //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
        curl_easy_setopt(curl, CURLOPT_URL,"http://www.nengyouyun.cn/user/getAppversionnew2?apptype=H5C899DDC");
  // curl_easy_setopt(curl, CURLOPT_URL,"http://localhost/");
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的html主体数据输出到fp指向的文件
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的http头输出到fp指向的文件
        res = curl_easy_perform(curl);   // 执行
        if (res != 0) {

            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
        }
        fclose(fp);
        return true;
    }
}
bool postUrl(char *filename)
{
    CURL *curl;
    CURLcode res;
    FILE *fp;

    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;    

    if ((fp = fopen(filename, "w")) == NULL)
        return false;
    curl = curl_easy_init();
    if (curl)
    {
       // curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie.txt"); // 指定cookie文件

        curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "image",CURLFORM_COPYCONTENTS,"1.jpg",CURLFORM_END);
       //  curl_easy_setopt(curl,CURLOPT_HTTPPOST,formpost);     // POST  -liuzhenbo
        //curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容
        //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.nengyouyun.cn/user/getAppversionnew2?apptype=H5C899DDC");   // 指定url
        curl_easy_setopt(curl,CURLOPT_HTTPPOST,formpost);     // POST  -liuzhenbo
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);  //HTTP主体数据 -liuzhenbo
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的http头输出到fp指向的文件
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        curl_formfree(formpost);
    }
    fclose(fp);
    return true;
}
int main(void)
{
    getUrl("get");
    postUrl("post");
}

GET方式接收到服务器端发来的http头:

HTTP/1.1 200
Server: nginx/1.10.0 (Ubuntu)
Date: Mon, 17 Jun 2019 11:34:45 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Application-Context: cloud-gateway:7001

POST方式接收到服务器发来的http头:

HTTP/1.1 100 Continue

HTTP/1.1 200
Server: nginx/1.10.0 (Ubuntu)
Date: Mon, 17 Jun 2019 11:34:45 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Application-Context: cloud-gateway:7001

注:使用HTTP/1.1协议的curl,当要POST的数据大于1024字节的时候, curl并不会直接就发起POST请求, 而是会分为俩步。(我认为主要是为了节省资源)

 流程如下:

(1)发送一个请求, 包含一个Expect:100-continue, 询问Server使用愿意接受数据

(2)接收到Server返回的100-continue应答以后, 把数据POST给Server

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

时间: 2024-11-06 11:16:44

基于libcurl的GET与POST(HTTP1.1)的相关文章

C++基于libcurl 的文件下载

首先基于环境的配置这里不做详细描述,请务必保证依赖所需的库文件加载进去 通过libcurl下载文件,方法实现如下: #include <stdio.h> #include <curl/curl.h> #include "DownloadInfo.h" /************************************************************************/ /* create by: mengxiaoxin date:2

基于libcurl的POST(http)

#include <stdio.h> #include <curl/curl.h> int main (void) { char *url="http://www.nengyouyun.cn/user/getAppversionnew2?apptype=H5C899DDC"; //char *url="http://127.0.0.1:8080"; //Liuzhenbo //char *url="http://www.baidu.

C++ 用libcurl库进行http通讯网络编程

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密码 十.HTTP验证 十一.代码示例 1.基本的ht

C++ 用libcurl库进行http 网络通讯编程

一.LibCurl基本编程框架libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证.想要知道更多关于libcurl的介绍,可以到官网http://curl.haxx.se/上去了解,在这里不再详述. win32版的libcurl下载地址:htt

C++ 用libcurl库进行http通讯网络编程 【转】

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密

(转)libcurl库使用方法,好长,好详细。

一.ibcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP这些协议,同时支持使用SSL证书的安全文件传输:HTTP POST, HTTP PUT, FTP 上传, 基于HTTP形式的上传

基于ibcurl的跨平台多线程断点续传下载库

之前写过一个多线程断点续传的下载库,不过那个是基于一个linux的下载程序.windows下运行还好,android下就各种问题,调试起来还麻烦.后面开发游戏的时候,一方面对下载要求不高,另一方面也精力有限,所以就没有继续研究. 趁现在有时间,我希望实现一个自己满意的下载库,满足以下需求: 1.多线程下载,根据文件大小和下载的文件数目进行调度.一般情况下是一个文件一个文件按照顺序下载,如果文件比较多的情况下可以多个文件同时下载,这个是可以设置的. 2.断点续传.下载进度记录到一个配置文件中,要求

ubuntu编译libcurl

一个基于 libcurl 的 httpclient 1.ubuntu  libcurl 源码下载地址: http://packages.ubuntu.com/precise/libs/libcurl3 2.在电脑上运行的编译方式: ①安装 指定了安装目录     /usr/local/curl ②生成Makefile:./configure --prefix=/usr/local/curl ③make && make install ④可以看到lib库,已经安装在 /usr/local/c

2.1 LibCurl编程流程(转)

转载地址:http://blog.chinaunix.net/u/17660/showart_1822514.html2 LibCurl编程2.1 LibCurl编程流程在基于LibCurl的程序里,主要采用callback function (回 调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程:1. 调用curl_global_init()初始化libcurl2. 调用