余裕でさっき書いた文章は嘘っぱちのクソ文章でした。ごめんなさい。
plusapi.js は直さなくてもいいです。多分。
server.js のContent-Length がちゃんと指定されてないから問題なのだみたいでした。
YungSang はちっとも悪くないのである。俺はやっぱりだめな男だ。ごめんねYungSang。
var body = JSON.strigify(json) したもののバイト数と、
body.length が同じだと、エラーは発生しないけど、その誤差があると、
JSONファイルが正しく外に出ないで、エラーが出るみたい。
というわけで、server.jsの下のほうを
// 改行とスペースを改行だけにする
while(body.match(/\n\s/gi)){
body = body.replace(/\n\s/gi,"\n");
}
// 改行を取り除く
body = body.replace(/\n/gi,"");
// バイト数を得る(後述)
var bodyByte = (function(body){
var c = 0;
for(var i = 0,l = body.length; i < l; i ++){
c += (escape(body.charAt(i)).length < 4) ? 1 : 2;
}
return c;
})(body);
// バイト数とbody.length の差を バイト数に追加。
bodyByte += (bodyByte - body.length);
// ヘッダをセットして送信
res.header('Content-Type', 'application/json');
res.header('Content-Length', bodyByte);
res.send(body);
改行を取り除く辺りが必要なのか否かは、ちょっと不明。
取りあえず、そうやったら動いているので、そうしています。
正規表現を理解していないのが露呈している感じです。
で、バイト数を得るってところは、
文字列のバイト数を求める
ここを参考にしました。無駄に無名関数。
というわけで、UTF-8コードにしなくても、activity.access をいじらなくても、データが取れました。
よかったよかった。ありがとうYungSang。グレイトフル・リスさん。
Javascript 関係の何かしらを書いています。
node.js / Titanium Mobile / Three.js 等など。
仕事探してます。のんびり屋さんです。
Twitter @psychedesire です。
2012年1月21日土曜日
続々・Titanium 1.8 のHTTPClient で Could not find class 'org.apache.http.entity.mime.content.StringBody' というエラー
というわけで、全ての原因がわかったー!のである?かも。
着地、JSONが壊れている?のが原因だった。
ていうか、
try{var json = JSON.parse(str);}catch(e){alert("dame-");}
て、やってなかったから、ハングアップしてたんだけども。
取りあえず、前回書いたUTF-8コードに置き換えて、
更にescape(responseText)して、WebViewにぶん投げて、
WebViewのjQueryで$("body").html(escapedJSON);ってして、結果を見てみた。
Stringが壊れてるってなって、どんなデータなのか把握も出来ない感じになるので、
そこが困った。
対処法としては、 items[i].access が今回変になるのを確認したので、
plusapi.js の
1023~1027行辺り の access{} をコメントアウトして、
1152行辺りに、activity.access.items.push();しているIFが3つあると思うんで、
そのIFを3つ全部コメントアウトしたら、取りあえず大丈夫になった。
でも、今一旦動くだけで、
なんか例外的に変なものが投げられたりすると、JSONパースエラー起こすかもなーとは思う。
細々書き直していたので、行数は目安で。
でも、この、activity.access.items.push() のところ、別に変になる理由ないんだけどなー。なんなんだろ?
わけが判らないなー。
オブジェクトの{ } がちゃんと閉じられてなかったんだよねぇ。謎。
前回だったか、Content-Length : body.length ってサーバ側でやってて、
クライアント側でresponseText.length ってやったときの、数字が違うことがあったりした。
xhr.onload = function(){
var contentLength = this.getResponseHeader("Content-Length")
var bodyLength = this.responseText.length;
Ti.API.info("contentLength - " + contentLength);
Ti.API.info("bodyLength - " + bodyLength);
}
Titanium側でこんなのやったんだけども。
うむー。わけがわからないなー。まぁ、とりあえず、一旦動くようになったので、報告でした。
全体的なまとめとしては、
サーバ側
server.js
・ res.header('Content-Length', body.length); をつける。
・ if (req.query.callback) {} をコメントアウトする(俺だけ)
plusapi.js
・ 前の記事の utf8ize() で全部の文字をUTF-8コードにしておいた(必要ないかも)
・ activity.access オブジェクトを全部削除してみた。
クライアント側
ちゃんとJSONは try{} のなかでパースしましょう。基本です。
こんな感じでした。
着地、JSONが壊れている?のが原因だった。
ていうか、
try{var json = JSON.parse(str);}catch(e){alert("dame-");}
て、やってなかったから、ハングアップしてたんだけども。
取りあえず、前回書いたUTF-8コードに置き換えて、
更にescape(responseText)して、WebViewにぶん投げて、
WebViewのjQueryで$("body").html(escapedJSON);ってして、結果を見てみた。
Stringが壊れてるってなって、どんなデータなのか把握も出来ない感じになるので、
そこが困った。
対処法としては、 items[i].access が今回変になるのを確認したので、
plusapi.js の
1023~1027行辺り の access{} をコメントアウトして、
1152行辺りに、activity.access.items.push();しているIFが3つあると思うんで、
そのIFを3つ全部コメントアウトしたら、取りあえず大丈夫になった。
でも、今一旦動くだけで、
なんか例外的に変なものが投げられたりすると、JSONパースエラー起こすかもなーとは思う。
細々書き直していたので、行数は目安で。
でも、この、activity.access.items.push() のところ、別に変になる理由ないんだけどなー。なんなんだろ?
わけが判らないなー。
オブジェクトの{ } がちゃんと閉じられてなかったんだよねぇ。謎。
前回だったか、Content-Length : body.length ってサーバ側でやってて、
クライアント側でresponseText.length ってやったときの、数字が違うことがあったりした。
xhr.onload = function(){
var contentLength = this.getResponseHeader("Content-Length")
var bodyLength = this.responseText.length;
Ti.API.info("contentLength - " + contentLength);
Ti.API.info("bodyLength - " + bodyLength);
}
Titanium側でこんなのやったんだけども。
うむー。わけがわからないなー。まぁ、とりあえず、一旦動くようになったので、報告でした。
全体的なまとめとしては、
サーバ側
server.js
・ res.header('Content-Length', body.length); をつける。
・ if (req.query.callback) {} をコメントアウトする(俺だけ)
plusapi.js
・ 前の記事の utf8ize() で全部の文字をUTF-8コードにしておいた(必要ないかも)
・ activity.access オブジェクトを全部削除してみた。
クライアント側
ちゃんとJSONは try{} のなかでパースしましょう。基本です。
こんな感じでした。
登録:
投稿 (Atom)