2013-11-14 115 views
1

我是C++開發新手,我一直在嘗試使用libcurl。libcurl C++添加http獲取參數

我基本上在尋找一個函數,讓我輸入類似於curl中的-d標誌的參數。

例如如果我只是直接發送在捲曲URL請求或web瀏覽器的URL看起來像「https://www.example.com/hello.json?whoisawesome=me&whosucks=yomomma

的話,我怎麼能養活作爲建議它的libcurl並不像一個網址這個問題接受的答案: Add paramethers to libcurl GET in c++

但作爲參數,我可以添加?我希望這個調用會自動「清理」文本(例如,在字符串中支持&符號(&)和等號(=)。我確定還有其他的情況,但這是我現在唯一能想到的一種情況)。當然,我可以自己創建一個清理字符串的函數,但是我想知道是否有內置於libcurl的函數。

我檢查了API文件,但我guuss我不夠熟悉,以成功導航找到我所需要的。

謝謝你的時間

回答

1
  1. 前面已經說過,完整的URL包括GET參數必須手動建立。
  2. 智能檢查,如剝離前導或尾隨空格,不是libcurl的責任。
  3. 進行URL編碼,您可以使用curl_easy_escape一個參數(消毒)一部分。無論如何,部分應該在你的手中。
+0

伊萬的答案很好,但圖書館的建議肯定會幫助那些想要解決這個問題的人,就像我一樣。 – ThinkBonobo

1

你不能。您需要指定完整的url,這意味着它不僅包含服務器名稱,還包含模式,路徑,端口和查詢(即您的GET參數)。我認爲這是做這件事唯一沒有害怕的方式。

+0

吮吸......但很高興知道。 – ThinkBonobo

1

我只是用這樣的事情在C++ 11:

typedef std::map<std::string, std::string> Params; 

static std::string params_string(Params const &params) 
{ 
    if(params.empty()) return ""; 
    Params::const_iterator pb= params.cbegin(), pe= params.cend(); 
    std::string data= pb-> first+ "="+ pb-> second; 
    ++ pb; if(pb== pe) return data; 
    for(; pb!= pe; ++ pb) 
    data+= "&"+ pb-> first+ "="+ pb-> second; 
    return data; 
} 

// ... 

auto str= get("where.com?"+ params_string({ {"q", "C++"}, { "img", "true" } })); 

// lets you write pretty API clients 
+0

地圖管理參數很棒,但您是如何解決「清理」字符串的問題的?我們是否必須自己做,或者是否有預先編入libcurl的東西? – ThinkBonobo

+0

@ThinkBonobo如果你的意思是檢查參數的完整性,有很多事情要做。您將不得不檢查它們是否代表正確的數據類型,剝離空間,甚至可能防止注入。由於大多數參數需要自定義驗證,因此最好通過手動完成。 – nurettin

+0

它是你提到的,需要採取的這麼多事情,我很驚訝,沒有功能,將清潔更普遍需要的問題,特別是注入攻擊,字符替換和空間剝離護理同樣的原因。當然,總是需要自定義驗證,但具有處理'樣板文件'功能的功能仍然很好。謝謝你的幫助! – ThinkBonobo