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
にアクセスすると下記のようになるかと思います。
ここまで来たら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
と出れば成功です。
正直、文字列だけ帰ってきてもアレなので、json形式でデータをもらって、それをパースして扱うところまでやりたいところです。