Cocos2dx HTTP通信とpicojsonを試してみる

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

前回はWebsocketでの通信を試してみたんですけど、
今回はHTTP通信でやってみます。

JSONパーサーはkazuhoさんが公開しているpicojsonを使用させていただきました。 [http://coderepos.org/share/browser/lang/cplusplus/picojson/trunk/picojson.h:title]
他の人はspine/Json.h使っているのが普通なんでしょうか?

では早速

レスポンスデータは以下の状態としています。

{“id”:1000101001,“title”:“Befool blog”,“is_bool”:false}

HelloWorld.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

#include <HttpRequest.h>
#include <HttpClient.h>


USING_NS_CC;
using namespace network;

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
    CREATE_FUNC(HelloWorld);

    //Callback
    void onHttpRequestCallBack(HttpClient* sender, HttpResponse* response);

};

#endif // __HELLOWORLD_SCENE_H__

ヘッダー読み込みとコールバックメソッドの宣言してるだけ

HelloWorld.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "HelloWorldScene.h"
#include "picojson.h"

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    if ( !Layer::init() ) return false;

    //HTTP通信
    std::vector<std::string> headers;
    headers.push_back("Content-Type: application/json; charset=utf-8");
    HttpRequest *request = new HttpRequest();

    request->setUrl("http://domain.net/*****");  //URLは自分の環境にあわせてください
    request->setRequestType(HttpRequest::Type::GET);
    auto ad = &HelloWorld::onHttpRequestCallBack;
    request->setResponseCallback(this, SEL_HttpResponse(ad));
    request->setHeaders(headers);
    HttpClient::getInstance()->send(request);
    request->release();

    return true;
}

//callback
void HelloWorld::onHttpRequestCallBack(HttpClient* sender, HttpResponse* response)
{
    picojson::value response_data;
    std::string err;

    CCASSERT(response, "response empty");
    CCASSERT(response->isSucceed(), "response failed");

    //Json取得
    std::vector<char>* buffer = response->getResponseData();
    char * json = (char *) malloc(buffer->size() + 1);
    std::string s2(buffer->begin(), buffer->end());
    strcpy(json, s2.c_str());
    picojson::parse(response_data, json, json + strlen(json), &err);

    CCASSERT(err.empty(), err.c_str());

    picojson::object& values = response_data.get<picojson::object>();

    //id
    auto id = Value(values["id"].get<double>());
    CCLOG("%d", id.asInt());

    //title
    auto title = Value(values["title"].get<std::string>());
    CCLOG("%s", title.asString().c_str());

    //is_bool
    auto is_bool = Value(values["is_bool"].get<bool>());
    CCLOG("%s", is_bool.asString().c_str());
}

ログはこんな感じ

f:id:raharu0425:20140509111942p:plain

とりあえず成功他のアプリとかは通信系の処理どうしてるのかなー