Ti ヘッダ 取りにくい
検索クエリ「Ti ヘッダ 取りにくい」の方にのみお送りしております。
私の場合 Titanium でHTTP 通信したくなった結果こういうことになりました。
気づいたことなど
- iPhone だと、getAllResponseHeaders できないらしい。(動きとドキュメント見た限り)だから、ヘッダは個別に取得する必要がある。
- iPhone シミュレータで、 req.getStatus() するとどうしてもエラーになる。req.status すると素直に取れた。ドキュメントの嘘つき・・。
- Titanium Studio についてる Ajax Monitor は、ブラウザの通信しか教えてくれない。Ti.Network.createHTTPClient でやるなら、WireShark とか使う必要がありあそう。
- いろいろとたまに動かなくなって、JavaScript がミスってるのか、不可解なTitanium のエラーなのかが分からなくなってきてしんどい。慣れてきたけど。
- 非同期管理モジュール q を使ってみた。node 系のモジュールがそのまま使えるからありがたい。
- 追記)cookie は勝手に管理してくれているようだ。
- 追記)Titanium Studio を開くたびに「アップデートがあるよ」と言われる。
// 使用例 var http = require('http'); // リクエストを送る http.post('http://localhost:3000/post', { title: 'タイトル', body: '本文' }) .then(function(res) { console.log(res.getStatus()); // 200 とか console.log(res.getJson()); // responseText の JSON.parse 結果 console.log(res.getHeader('Content-Type')); // 'application/json;charset=UTF8' }) .fail(function(reason) { console.log(reason); // 失敗した理由 });
http.js の中身
var Q = require('../libs/q'); var Response = require('./response'); var _ = require('../libs/underscore'); var URL = require('../libs/url'); var querystring = require('../libs/querystring'); /** * @param {string} url . * @param {Object} params . */ var buildUrlForGet = function(url, params) { url = URL.parse(url); url.query = _.extend(url.query, querystring.parse(params)); return url.toString(); }; /** * @param {string} method . * @param {string} url . * @param {Object} params . * @return {Object} Promise to response. */ var request = function(method, url, params) { var defer = Q.defer(), usePost = method === 'POST', req = Ti.Network.createHTTPClient(); if (!usePost && params) { url = buildUrlForGet(url, params); } if (usePost) { req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } req.setAutoRedirect(false); req.onload = function() { defer.resolve(new Response(req)); }; req.onerror = function(reason) { defer.reject({ reason: reason }); }; req.open(method, url); req.send(usePost && params); return defer.promise; }; /** * @param {string} url . * @param {Object} query . * @return {Object} Promise to response. */ var get = function(url, query) { return request('GET', url, query); }; /** * @param {string} url . * @param {Object} body . * @return {Object} Promise to response. */ var post = function(url, body) { return request('POST', url, body); }; module.exports.get = get; module.exports.post = post;
更にクッキーを保存・送信する仕組みも必要だなー。大変だ。
追記)クッキーは自動的に保存しているようだった。2度目に作った HTTPClient には、1度目の responseHeader の Set-Cookie がちゃんと載っている。