• Curl命令简介


    相关1:http://blog.csdn.net/windows_nt/article/details/9630567

    相关2:http://php.net/manual/zh/function.curl-setopt.php

    1、使用curl命令发送post数据:

    curl -d ‘{post内容}’ ip(或域名)/path?get参数

    如:curl -d ‘{post内容}’ baidu.com/ask?p=xx

    2、使用curl命令发送get数据

    curl ‘请求url

    3、c++下使用curl命令:

    #include <curl/curl.h>
    
        CURL *curl;  // 声明一个CURL对象
        CURLcode res; //如果成功,会返回一个CURLE_OK标记,反之,会给你一个数字,你可以在curl.h里面找到对应的解释。
        curl = curl_easy_init(); // 初始化一个Curl对象,它会生成一个CUrl的指针返回。如果返回是NULL,就是建立链接失败。
        curl_slist *plist = curl_slist_append(NULL,
                "Content-Type:application/json;charset=UTF-8");
        char url_buffer[MAX_BUFFER_LEN_M];
        url_buffer[0] = '';
        char post_buffer[MAX_BUFFER_LEN_M];
        post_buffer[0] = '';
        bds_xl_str_t xl_str;
    xl_str.clear();
    
        snprintf(url_buffer, sizeof(url_buffer), g_conf.req_url.c_str());
        snprintf(post_buffer, sizeof(post_buffer), "{"acid":%d,"request":{"ids":{"type":%d,"id":"%s"}}}",
                g_conf.account_id, id_type, imei.c_str());
    
        if (curl)
        {
            curl_easy_setopt(curl, CURLOPT_URL, url_buffer); // 请求地址
            curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_buffer); // 请求的post内容
            curl_easy_setopt(curl, CURLOPT_HTTPHEADER, plist); //将plist设置的字符串,附加到Http请求消息头上
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_buffer); // 设置回调接口write_buffer
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &xl_str);// 指定一个对象,用于你在回调函数的时候将收到的数据片拼接成一个完整的。
            curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); // //注意,毫秒超时一定要设置这个,否则会core
            curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 40L); // 设置超时时间(允许 cURL 函数执行的最长毫秒数。),如果服务器在40毫秒不返回,Curl就会触发一个TimeOUT错误,CURLOPT_TIMEOUT对应的是秒
            res = curl_easy_perform(curl);//开始执行你的url下载活动,他返回一个CUrlRes 对象
    
            if (CURLE_OK != res)
            {
                XGL_LOG_WARNING("Curl http request failed [%d]", res);
                curl_slist_free_all(plist);
                curl_easy_cleanup(curl);
                return -1;
            }
            curl_slist_free_all(plist); //当你一次抓取执行完毕,你必须设置curl_slist_free_all(plist);除非你的plist在下次使用的时候和以前一样,则不必做这样的操作。但是最终你必须curl_slist_free_all(plist);否则会有内存泄露。
            curl_easy_cleanup(curl);//当你执行完你的网页抓取,一定不要忘了curl_easy_cleanup(m_pCurl);释放你这个对象,否则同理,你的内存会泄露。
        }
        else
        {
            XGL_LOG_WARNING("Init curl failed");
            return -1;
        }

         Json::Reader reader;
         Json::Value value;
         if (!reader.parse(xl_str.c_str(), xl_str.c_str() + xl_str.size(), value))
         {
            XGL_LOG_WARNING("Json parse failed [%s]", tdata.xl_str.c_str());
            return -1;

          }

     

    回调函数:

    size_t write_buffer(void *buffer, size_t size, size_t nmemb, void *userp)
    {
        if (!buffer)
        {
            XGL_LOG_WARNING("get_user_portray: return buffer is null");
        }
    
        if (size* nmemb > MAX_BUFFER_LEN_L -1)
        {
            XGL_LOG_WARNING("buffer is too long");
        }
        bds_xl_str_t *receive_str = static_cast<bds_xl_str_t*>(userp);
        return receive_str->append((const char*)buffer, size * nmemb);
    }

    bds_xl_str_t的定义:

    const size_t XL_STR_SIZE = 1024 * 16;
    #define
    BDS_ASSERT(cond) bds_assert< (cond) >::assert_true() template <bool condition> struct bds_assert{}; template <> struct bds_assert<true> { static void assert_true(){} }; // 定长string wrapper template <size_t bucket> struct bds_str_t { bds_str_t() { BDS_ASSERT(bucket > 1024); data[0] = ''; len = 0; } inline void clear() { data[0] = ''; len = 0; } // 返回实际写入的字符数目,空间不足时,直接return 0,不进行写入 inline size_t append(const char* str, size_t str_len) { if (str_len > remains()) { return 0; } memcpy(data + len, str, str_len); len += str_len; data[len] = ''; return str_len; } inline size_t remains() const { return (len + 1) < bucket ? (bucket - len - 1) : 0; } inline const char * c_str() const { return data; } inline size_t size() const { return len; } char data[bucket]; size_t len; }; typedef bds_str_t<XL_STR_SIZE> bds_xl_str_t;
  • 相关阅读:
    H5前端上传文件的几个解决方案
    MyEclipse和Eclipse各个版本的汉化破解(包括7.59.0和Eclips的ehelios、indigo各版本)
    学习C#中的事件和委托
    JS学习笔记(一)JS处理JSON数据
    图解Eclipse开发C++、C语言的配置过程使用CDT和MinGw
    ASP.NET使用C#实现的最简单的验证码方法
    微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
    PHP开发笔记(二)PHP的json_encode和json_decode问题
    C博客作业00——我的第一篇博客
    extern "c"
  • 原文地址:https://www.cnblogs.com/myyan/p/7486202.html
Copyright © 2020-2023  润新知