2012年1月19日木曜日

続・Titanium 1.8 のHTTPClient で Could not find class 'org.apache.http.entity.mime.content.StringBody' というエラー

というわけで、前回の続きを延々と悩んで色々とやっていた。
なにをやっていたかは、
ここら辺を見ると判ると思いますが、なんか、試行錯誤過ぎてワロタ。


前回の記事では、TitaniumMobileのバージョンを 1.9.0 に上げるというところまでやった。
で、そのあと、サーバが Unavailable ってなってて、変だって書いたんだけど、
どうやら JSON を取りに行くたびにサーバが落ちるらしい。
node.js は、 forever という npm モジュールを使わない限り、
自動的にサーバが再起動したりしない(はず)なので、
JSONを取りに行って、サーバが処理できなくなって落ちて、
サーバが落ちたのに気づかずもう一回取りに行って、ReadyState3で止まるというわけみたい。

で、それがわかったので、サーバサイドに焦点をあてて色々やったんだけど、
まず、エラー文章を見てわかるとおり、StringBodyがなんか変だって書いてあるので、
そこをまず直した。

Google + 非公式API のnode.js のプログラムはこれ。 YungSang の美しいプログラムである。うっとり。
レスポンスを返している部分が、

function responseJSON(req, res, json) {
res.statusCode = (json.error ? json.error.code : 200);
res.charset = 'UTF-8';
res.header('cache-control',
'private, max-age=0, must-revalidate, no-transform');
var body = '';
if (typeof req.query.prettyPrint == 'undefined') {req.query.prettyPrint = true;}
if (typeof req.query.pp == 'undefined') {
req.query.pp = true;
}

if ((req.query.prettyPrint == true) && (req.query.pp == true)) {
body = JSON.stringify(json, null, ' ');
}
else {
body = JSON.stringify(json);
}

if (req.query.callback) {
res.header('Content-Type', 'text/javascript');
res.send('// API callback\n'
+ 'if (typeof ' + req.query.callback + ' == "function") '
+ req.query.callback + '(' + body + ');');
}
else {
res.header('Content-Type', 'application/json');
res.send(body);
}

こんな感じなんだけど、
ここのif(req.query.callback){}が誤動作しているのかTitaniumが悪いのか(多分Titaniumが悪い)、
TitaniumからJSONを取ろうとすると、

&callback=? としてないにもかかわらず、

JSONP、つまり、コールバックで受けようとする?のか、エラーを吐くので、
ここをまるっとコメントアウトしてやった。

つまり、
res.header('Content-Type', 'application/json');
res.send(body);
これだけになった。

で、Content-Length がないので、
res.header('Content-Type', 'application/json');
res.header('Content-Length', body.length);
res.send(body);


こんな感じにしてやると、とりあえず、エラーが収まって、データの取得(ReadyState4 200)になった。
のだが、今度は取得した JSON を JSON.parse したらエラーになる。
node.js で JSON.stringify すると、 "hoge": "huga" と ": " 余計なスペースが開くので、
これが原因か?と思ったけど、そうではないらしい。

node.js の JSON.stringify が、UTF-8 コードで文字列を返さないのが原因か?とも思ったけど、
Wassr の JSON も同様なのに動いているので、問題があるとも思えない。

というわけで、結果、お手上げでした。
んがー。悔しい。

あと、凄く動でもいい豆知識ですけど、

res.send(body);

この body って、

body = JSON.stringify(json);

json っていう {} を文字列に変換したものなんですよね。
で、

res.send(json);

という風に、javascript のオブジェクトを無理やり送信しても、
ちゃんとサーバが JSON文字列にして返してくれます。
凄く時間がかかるけど。まぁ、一応。

0 件のコメント:

コメントを投稿