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] = '\0';
    char post_buffer[MAX_BUFFER_LEN_M];
    post_buffer[0] = '\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] = '\0'; len = 0; } inline void clear() { data[0] = '\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] = '\0'; 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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM