pig's diary

何でも忘れるので万年初心者ね

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 がちゃんと載っている。