目前共有3篇帖子。 内容转换:不转换▼
 
点击 回复
468 2
【程序】C++使用WinHttp发送HTTP请求,然后用MSXML6解析从服务器获得的XML内容
一派护法 十九级
1楼 发表于:2016-2-18 13:33
【功能】
调用Arslanbar2.0 API获取并显示最新的25个主题帖的标题。
【程序运行结果】

一派护法 十九级
2楼 发表于:2016-2-18 13:34
【C++代码】
// HTTP.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <sstream>

#include <comutil.h>
#include <MsXml6.h>
#include <Windows.h>
#include <Winhttp.h>

#pragma comment(lib, "comsuppw.lib")
#pragma comment(lib, "msxml6.lib")
#pragma comment(lib, "Winhttp.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    IXMLDOMDocument *pXMLDoc;
    CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pXMLDoc));

    HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);
    if (hSession)
    {
        HINTERNET hConnect = WinHttpConnect(hSession, L"zh.arslanbar.net", INTERNET_DEFAULT_HTTP_PORT, NULL);
        HINTERNET hRequest = WinHttpOpenRequest(hConnect, NULL, L"API?variant=zh-cn&query=posts", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
        WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, NULL, NULL, NULL);

        BOOL bResult = WinHttpReceiveResponse(hRequest, NULL);
        if (bResult)
        {
            // 获取网页内容,以UTF-8编码存储到stream中
            DWORD dwRead = 0;
            DWORD dwSize;
            stringstream stream;
            while (WinHttpQueryDataAvailable(hRequest, &dwSize), dwSize > 0)
            {
                char *buffer = new char[dwSize];
                WinHttpReadData(hRequest, buffer, dwSize, &dwRead);
                stream.write(buffer, dwSize);
                delete[] buffer;
            }

            // 将UTF-8转换为UTF-16,再转换为BSTR
            string data = stream.str();
            stream.clear();
            dwSize = MultiByteToWideChar(CP_UTF8, NULL, data.c_str(), -1, NULL, NULL);
            LPWSTR w_data = new WCHAR[dwSize];
            MultiByteToWideChar(CP_UTF8, NULL, data.c_str(), -1, w_data, dwSize);
            data.clear();
            BSTR b_data = SysAllocString(w_data);
            delete[] w_data;

            // 用MSXML6解析XML字符串
            VARIANT_BOOL flag;
            pXMLDoc->loadXML(b_data, &flag);
            SysFreeString(b_data);
            if (flag == VARIANT_TRUE)
            {
                // 解析成功
                IXMLDOMElement *root;
                IXMLDOMNodeList *children;
                long i, length;
                pXMLDoc->get_documentElement(&root);
                root->get_childNodes(&children);
               
                children->get_length(&length);
                cout << "共有" << length - 1 << "个主题: " << endl;
                for (i = 1; i < length; i++)
                {
                    IXMLDOMNode *post_node;
                    IXMLDOMNode *title_node;
                    BSTR b_title;
                    children->get_item(i, &post_node);
                    post_node->get_firstChild(&title_node);
                    title_node->get_text(&b_title);
                   
                    string title = bstr_t(b_title);
                    cout << title << endl;
                    SysFreeString(b_title);

                    title_node->Release();
                    post_node->Release();
                }

                children->Release();
                root->Release();
            }
            else
                cout << "解析XML字符串失败" << endl;
        }

        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
    }
    else
        cout << "Error " << GetLastError() << " in WinHttpOpen." << endl;

    WinHttpCloseHandle(hSession);
    pXMLDoc->Release();
    CoUninitialize();
    std::system("pause");
    return 0;
}
一派护法 十九级
3楼 发表于:2016-2-18 13:46
【C++代码2:不使用bstr_t类】
// HTTP.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <sstream>

#include <comutil.h>
#include <MsXml6.h>
#include <Windows.h>
#include <Winhttp.h>

#pragma comment(lib, "comsuppw.lib")
#pragma comment(lib, "msxml6.lib")
#pragma comment(lib, "Winhttp.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    IXMLDOMDocument *pXMLDoc;
    CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pXMLDoc));

    HINTERNET hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);
    if (hSession)
    {
        HINTERNET hConnect = WinHttpConnect(hSession, L"zh.arslanbar.net", INTERNET_DEFAULT_HTTP_PORT, NULL);
        HINTERNET hRequest = WinHttpOpenRequest(hConnect, NULL, L"API?variant=zh-cn&query=posts", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
        WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, NULL, NULL, NULL);

        BOOL bResult = WinHttpReceiveResponse(hRequest, NULL);
        if (bResult)
        {
            // 获取网页内容,以UTF-8编码存储到stream中
            DWORD dwRead = 0;
            DWORD dwSize;
            stringstream stream;
            while (WinHttpQueryDataAvailable(hRequest, &dwSize), dwSize > 0)
            {
                char *buffer = new char[dwSize];
                WinHttpReadData(hRequest, buffer, dwSize, &dwRead);
                stream.write(buffer, dwSize);
                delete[] buffer;
            }

            // 将UTF-8转换为UTF-16,再转换为BSTR
            string data = stream.str();
            stream.clear();
            dwSize = MultiByteToWideChar(CP_UTF8, NULL, data.c_str(), -1, NULL, NULL);
            LPWSTR w_data = new WCHAR[dwSize];
            MultiByteToWideChar(CP_UTF8, NULL, data.c_str(), -1, w_data, dwSize);
            data.clear();
            BSTR b_data = SysAllocString(w_data);
            delete[] w_data;

            // 用MSXML6解析XML字符串
            VARIANT_BOOL flag;
            pXMLDoc->loadXML(b_data, &flag);
            SysFreeString(b_data);
            if (flag == VARIANT_TRUE)
            {
                // 解析成功
                IXMLDOMElement *root;
                IXMLDOMNodeList *children;
                long i, length;
                pXMLDoc->get_documentElement(&root);
                root->get_childNodes(&children);
               
                children->get_length(&length);
                cout << "共有" << length - 1 << "个主题: " << endl;
                for (i = 1; i < length; i++)
                {
                    IXMLDOMNode *post_node;
                    IXMLDOMNode *title_node;
                    BSTR b_title;
                    children->get_item(i, &post_node);
                    post_node->get_firstChild(&title_node);
                    title_node->get_text(&b_title);
                   
                    char *title = _com_util::ConvertBSTRToString(b_title);
                    cout << title << endl;
                    delete[] title;
                    SysFreeString(b_title);

                    title_node->Release();
                    post_node->Release();
                }

                children->Release();
                root->Release();
            }
            else
                cout << "解析XML字符串失败" << endl;
        }

        WinHttpCloseHandle(hRequest);
        WinHttpCloseHandle(hConnect);
    }
    else
        cout << "Error " << GetLastError() << " in WinHttpOpen." << endl;

    WinHttpCloseHandle(hSession);
    pXMLDoc->Release();
    CoUninitialize();
    std::system("pause");
    return 0;
}

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:468 回复数:2
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-2-18 13:46
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。