2013-11-14 116 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