ことばアルバム

にわかエンジニアのにわか備忘録

cocos2d-xでhttp通信

cocos2d-xで作ったアプリケーションでhttp通信を試したときのメモ。
今回もバージョンは3.0rcです。
今回はWebアプリケーションを用意して、それに対してhttp通信をしてレスポンスを取得する、というものです。
でも、今回のはそんなに役に立たなかったからまた次回、ちゃんと調べて書くかもしれないです。
最終的にやりたい事としては、json形式かなんかでデータをもらってきて、それをパースして扱うところまでやりたいです。


Webアプリケーション

今回はnode.jsを使ったexpressフレームワークで用意しました。
「express・・・?はて?」という方は、expressのクイックスタートを参考にしてみてください。
とても簡単にWebアプリケーションを立ち上げられるのですごく便利です。
$ express -e cocos_projectで作ったプロジェクトのroutes/index.jsを下記のように書き換えました。

/*
 * GET home page.
 */

exports.index = function(req, res){
  //res.render('index', { title: 'Express' });
  res.send('hello world cocos2dx');
};

この状態でnode app.jsでアプリケーションを立ち上げて、
http://localhost:3000にアクセスすると下記のようになるかと思います。

f:id:is4cafe:20140327000747p:plain

ここまで来たらWebアプリケーション側は準備完了です。


実装

ここからはcocos2d-x側の実装です。
新しく生成したプロジェクトのHelloWroldScene.hに下記の変更を加えます。
まずはnetwork/HttpClient.hを使えるようにします。

#include "network/HttpClient.h"

そして、メソッドを2個追加します。

void httpRequest();
virtual void callback(cocos2d::network::HttpClient* sender, cocos2d::network::HttpResponse* response);

 

続いて、HelloWorldScene.cppの方に移ります。
こちらでもHttpClientを使えるようにします。

#include "network/HttpClient.h"
using namespace cocos2d::network;

次に、HelloWorldScene.hで定義したメソッドを実装していきます。

void HelloWorld::httpRequest()
{
    auto httpRequest = new HttpRequest();
    
    httpRequest->setUrl("http://localhost:3000");
    httpRequest->setRequestType(HttpRequest::Type::GET);
    httpRequest->setResponseCallback(this, httpresponse_selector(HelloWorld::callback));
    
    network::HttpClient::getInstance()->send(httpRequest);
}

void HelloWorld::callback(HttpClient* sender, HttpResponse* response)
{
    std::vector<char>* data = response->getResponseData();
    std::string result(data->begin(), data->end());
    CCLOG(result.c_str());
}

1個ずつ見て行きます。

void HelloWorld::httpRequest()
{
    auto httpRequest = new HttpRequest();
    
    httpRequest->setUrl("http://localhost:3000");
    httpRequest->setRequestType(HttpRequest::Type::GET);
    httpRequest->setResponseCallback(this, httpresponse_selector(HelloWorld::callback));
    
    network::HttpClient::getInstance()->send(httpRequest);
}

まずはHttpRequestインスタンスを作ります。
そして、このHttpRequestでリクエストを送るURLを設定します。(今回はローカルで動いているexpressなので、localhost:3000
続いて、リクエストのタイプを指定します。
今回はリクエストの受けてをapp.get('/', routes.index);としているのでGETの通信にします。
ここで指定しているHttpRequest::Typeは下記のものがあるので、必要に応じて使い分けます。

enum class Type
{
   GET,
   POST,
   PUT,
   DELETE,
   UNKNOWN,
};

そして、レスポンスが帰ってきたときのコールバックメソッドを指定します。
最後に、network::HttpClient::getInstance()->send(httpRequest);でリクエストを送ります。

 

コールバックの方では、レスポンスのデータをログに出しているだけです。

void HelloWorld::callback(HttpClient* sender, HttpResponse* response)
{
    std::vector<char>* data = response->getResponseData();
    std::string result(data->begin(), data->end());
    CCLOG(result.c_str());
}

 
最後に、init()の中とかでhttpRequest();を呼び出してあげます。

ここまでで実装は終わりで、実際に起動してみます。


結果

結果というほどのものでもないですが、、、
node側では下記のようなログが出るかと思います。

$ node app.js 
Express server listening on port 3000
GET / 200 7ms - 20b

 
cocos2dx側のログに下記のようにhello world cocos2dと出れば成功です。

f:id:is4cafe:20140327002658p:plain

正直、文字列だけ帰ってきてもアレなので、json形式でデータをもらって、それをパースして扱うところまでやりたいところです。