cocos2d-x 3.1.1 學習筆記[11] http請求 + json解析


//http需要引入的頭文件和命名空間
#include <network/HttpClient.h>
using namespace network;

//json需要引入的頭文件
#include <json/document.h>

    //然後聲名兩個函數
    void http();//用於執行http請求
    void onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response);// http請求的回調

void Nice::http()
{
    //創建一個get請求
    HttpRequest* request = new HttpRequest();
    request->setUrl("http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&output=json&ak=Gk0Bbh9H4iREjesugyEqySN7");
    request->setRequestType(HttpRequest::Type::GET);
    request->setResponseCallback(CC_CALLBACK_2(Nice::onHttpRequestCompleted, this));
    request->setTag("json");
    HttpClient::getInstance()->send(request);
    request->release();
    
    //創建一個post請求
    HttpRequest* request_post = new HttpRequest();
    request_post->setUrl("http://httpbin.org/post");
    request_post->setRequestType(HttpRequest::Type::POST);
    std::vector<std::string> headers;
    headers.push_back("Content-Type: application/json; charset=utf-8");
    request_post->setHeaders(headers);
    request_post->setResponseCallback(CC_CALLBACK_2(Nice::onHttpRequestCompleted, this));
    //post數據
    const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest";
    request_post->setRequestData(postData, strlen(postData));
    request_post->setTag("POST test2");
    HttpClient::getInstance()->send(request_post);
    request_post->release();
}

void Nice::onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response)
{
    if (!response) {
        return;
        
    }
    
    if (0 != strlen(response->getHttpRequest()->getTag())) {
        log("%s completed",response->getHttpRequest()->getTag());
    }
    
    long statusCode = response->getResponseCode();
    char statusString[64] = {};
    
    sprintf(statusString, "HTTP Status Code: %ld, tag = %s",statusCode,response->getHttpRequest()->getTag());
    log("response code: %ld",statusCode);
    
    if (!response->isSucceed()) {
        log("response failed");
        log("error buffer: %s",response->getErrorBuffer());
        return;
        
    }
    
    std::vector<char>* buffer = response->getResponseData();
    printf("Http Test, dump data: ");
    for (unsigned int i = 0 ; i < buffer->size();i++) {
        printf("%c",(*buffer)[i]);
    }
    
    //將std::vector(char)* 轉換成 std::string的兩種方法
    std::string backStr = std::string(&(*buffer->begin()), buffer->size());
    std::string anotherStr;
    anotherStr.insert(anotherStr.begin(), buffer->begin(), buffer->end());
    printf("%s\n", backStr.c_str());
    printf("%s\n", anotherStr.c_str());
    printf("\n");
    
    
    if (strcmp(response->getHttpRequest()->getTag(), "json") == 0) {
        rapidjson::Document doc;
        doc.Parse<0>(backStr.c_str());
        const rapidjson::Value& v = doc["status"];
        printf("status is : %s",v.GetString());
        const rapidjson::Value& dir = doc["results"];
        if (dir.IsArray()) {
            unsigned int i = 0;
            const rapidjson::Value& city = dir[i]["currentCity"];
            log("city is %s", city.GetString());
            //多層測試
            const rapidjson::Value& title = doc["results"][(unsigned int)0]["index"][(unsigned int)2]["title"];
            log("the title is %s", title.GetString());
        }
    }
    
    
}











發佈了39 篇原創文章 · 獲贊 4 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章