互联网基本要求:介绍
过去几天我一直在办公室听到关于如何繁琐,它是做一些互联网请求吨诅咒。基本上,一个同事写了一些Qt代码,想要做一些简单的GET。 QNetworkAccessManager,QNetworkReply,信号,槽中,deleteLater(),约3-7类 - 有点太多。所以,我抓起我是一个个人项目上使用的一些简单的类,并把他们弗拉德(尖叫的同事,不是impaler),瞧 - 问题解决了。背景
熟悉WININET是有用和非常基本的C类使用(wstring的,流)。为了解的Justin.TV REST的API - 请去的文档页。首发:从倒退
我们从这里开始,我们想要做什么。在这种情况下,我写码流播放,并我实施justin.tv支持, - 我做的{A} justin.tv API调用。int __cdecl
wmain(int argc, wchar_t** argv) {
// get justin.tv stream summary
jtv_test_streamsummary();
return 0;
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
}
调用流/摘要呼吁又将1 quot; justin.tvquot API调用 - 在jtv_api类的实现(见下文)。{C}
jtv_api的类(用于此目的的修剪版)实现公共的呼叫streamsearch;我不会进入JTV的REST API的细节 - 流/搜索返回XML或JSON直播频道的所有信息汇总。 (HTTP调用组成是最小的 - 只需追加基地浴/ API /流/总结此调用的参数 - 通道,类别,语言,到指定的值过滤结果,如果有的话 - 所以不要指望这特殊的非转义的案件或工作,请记住 - 它是一个范例。)class jtv_api {
private:
jtv_api() {
}
jtv_api() {
}
private:
jtv_api(const jtv_api&);
jtv_api& operator=(const jtv_api&);
public:
static bool streamsummary(std::wstring& data,
const std::wstring& channel,
const std::wstring& category,
const std::wstring& language
) {
// compose request relative url
std::wstring rpath = L"/api/stream/summary";
rpath += L".xml";
// add query part
std::wstring qry = L"";
if(!channel.empty()) {
if(!qry.empty()) {
qry += L"&"; }
qry += L"channel=";
qry += channel;
}
if(!category.empty()) {
if(!qry.empty()) {
qry += L"&"; }
qry += L"category=";
qry += category;
}
if(!language.empty()) {
if(!qry.empty()) {
qry += L"&"; }
qry += L"language=";
qry += language;
}
// append query part, if any
if(!qry.empty()) {
rpath += L"?";
rpath += qry;
}
return _execute_request(data, rpath);
}
反过来,所有的公共电话 - 公开呼吁,在这个版本:) - 这所有的HTTP和转换字节到std :: wstring的使用的_response_to_string的助手的私人助手_execute_request路线:{体C3}
我们的兴趣点是_execute_request呼叫:
{的C4}
其中凝聚了所有的互联网工作。这些电话使用如下所述互联网类(除internet_api所有类别,从internet_handle HINTERNET包装类派生)。internet_api API对象:无非看中的动态包装了WININET.DLL使用电话:InternetConnectW,InternetOpenW,InternetCloseHandle等;加载WININET.DLL,解决所有的API,使用GetProcAddress函数,并传递给所有需要的API调用其他类。实例和打开的会话对象,这就要求InternetOpenW;{C5的}实例的连接对象,调用InternetConnectW连接到主机:{5233}实例的internet_request REQ对象,,调用HttpOpenRequestW执行请求(使用默认动词),得到请求的响应(HttpSendRequestW),状态和数据(HttpQueryInfoW,InternetReadFile),并将其转换到std :: wstring的响应。{C7-}
一切都封装 - 在这个例子中,在_execute_request(数据,RPATH)调用。这是最初的目的 - 有一个简单的方法只有简单的Win32调用和简约类的HTTP客户端请求。
(支持类,pointer_t和vector_t说明 - 他们为确保更好的STL现金等价物和宇宙的提高肯定,但我的项目,最小的依赖(减去操作系统和VC运行库)是必须的,他们现在,为他们的目的。)历史版本1.0 - 2011年7月24日。