Saturday, January 24, 2015

Cocos2d-x: Request HTTP và parse JSON

Ở phần này chúng ta tìm hiểu việc sử dụng HttpRequest để kết nối đến máy chủ, nhận về chuỗi dữ liệu định dạng JSON sau đó phân tích chuỗi JSON đó.

Ta lấy ví dụ trong game Smart Memory, ở màn hình HighScore, game sẽ kết nối máy chủ để lấy về danh sách 20 người chơi có điểm cao nhất.

http://kensaistudio.com/?p=82
Giả sử server API để nhận về danh sách high score là
http://myserver.com/highscores
Chúng ta sẽ sử dụng đối tượng của lớp HttpRequest để thực hiện gửi request đến server

    HttpRequest* request = new HttpRequest();
    std::string url = "http://myserver.com/highscores";
  
    request->setUrl(url.c_str());
  
    std::vector<std::string> headers;
    headers.push_back("header-param1:value1");
    headers.push_back("header-param2:value2");
    request->setHeaders(headers);
  
    request->setRequestType(HttpRequest::Type::GET);
    request->setResponseCallback(CC_CALLBACK_2(HighScoreScene::httpResponse, this));
    request->setTag("GetRanking");
  
    HttpClient::getInstance()->send(request);
    request->release();
Nếu request yêu cầu thiết lập các tham số header (thường là vì mục đích bảo mật), chúng ta sẽ sử dụng hàm request->setHeaders().
    std::vector<std::string> headers;
    headers.push_back("header-param1:value1");
    headers.push_back("header-param2:value2");
    request->setHeaders(headers);
Vì đây là request dạng GET nên ta gọi request->setRequestType(HttpRequest::Type::GET)
Thiết lập hàm callback khi request nhận được dữ liệu phản hồi từ server
 request->setResponseCallback(CC_CALLBACK_2(HighScoreScene::httpResponse, this));
Cuối cùng, ta sẽ send request
HttpClient::getInstance()->send(request);
Tiếp đến chúng ta sẽ xét hàm callback httpResponse và tìm hiểu phần parse JSON
Giả sử định dạng chuỗi dữ liệu JSON trả về của High score như sau:
[
     {
        "player_id": "43",
        "player_name": "halo",
        "score": "234",
        "position": 1
    },
    {
        "player_id": "69",
        "player_name": "ari",
        "score": "132",
        "position": 2
    },
    {
        "player_id": "83",
        "player_name": "kath",
        "score": "87",
        "position": 3
    }
]
Hàm httpResponse sẽ phân tích để lấy các giá trị name, score, position, id của từng người chơi
void HighScoreScene::httpResponse(HttpClient* client, HttpResponse* response)
{
    if (response->getResponseCode() == 200) {
        rapidjson::Document document1;
        document1.Parse<0>(json.c_str());
        if (document1.IsArray()) {
            rapidjson::SizeType size = document1.Size();
       
            for (rapidjson::SizeType i = 0; i < size; i++) {
                std::string name  = document1[i]["player_name"].GetString();
                std::string score = document1[i]["score"].GetString();
                std::string pos   = std::to_string(document1[i]["position"].GetInt());
                std::string id    = document1[i]["player_id"].GetString();
            }
        }
    } else {
        //Error
    }
}
Phải kiểm tra mã lỗi trước khi phân tích dữ liệu qua hàm
response->getResponseCode()
Parse dữ liệu vào đối tượng rapidjson::Document
rapidjson::Document document1;
document1.Parse<0>(json.c_str());

No comments:

Post a Comment