今更だけどCocos2d-x v2.2.5のCCHttpRequest::getResponseData()でレスポンスを受け取り、JSONに解析するコードを書いてたんだけど、JSON文字列の末尾に変な文字列が付加されてしまう。これは前述のメソッドがレスポンスボディ終端にNULL文字を付加しないためらしい。
void HelloWorld::sendReqeust()
{
std::string url = "http://example.com/path/to/api";
CCHttpRequest *request = new CCHttpRequest();
request->setUrl(url.c_str());
request->setRequestType(CCHttpRequest::kHttpGet);
request->setResponseCallback(this, httpresponse_selector(HellowWorld::requestHandler));
CCHttpClient *client = CCHttpClient::getInstance();
client->send(request);
request->release();
}
void HelloWorld::requestHandler(CCHttpClient *sender, CCHttpResponse *response)
{
int responseCode = response->getResponseCode();
if ( responseCode != 200 )
{
CCLOG("Request Error: Code: %d", responseCode);
return;
}
// レスポンス取得
std::vector<char> *buffer = response->getResponseData();
// 手動で終端NULL文字を追加するとうまくいく(これはつらい)
buffer->push_back('\0');
CCLOG("Response string: %s", &(*buffer)[0]);
// parse json
rapidjson::Document json;
json<rapidjson::kParseDefaultFlags>(&(*buffer)[0]);
if ( settings.HasParseError() )
{
CCLOG("JSON Parse Error");
return;
}
….
}
3系では起こらないみたいだけど、何かの役に立つかもしれないのでメモ。
追記と理由
終端文字列を付加しないのは、画像のレスポンスを考慮してのことかもしれない、らしい。
なのでこれはこれで正しい実装なのかもしれない
または、
std::string(buffer->begin(), buffer->end());
とすればうまくいくみたい。