在Titanium HTTPClient使用cookie與header

titanium內建的HTTPClient本身就有實作cookie的功能,使用起來跟瀏覽器一樣,會自動解析response header,及發送以設定的cookie,而不需要額外去解析header,和添加request的header,要清除cookie可以使用clearCookies,若要在client端設定cookie,可以使用setRequestHeader

清除與設定cookie

建立一個HTTPClient:

1
var client = Ti.Network.createHTTPClient({});

指定清除某個網域底下的cookie:

1
client.clearCookies( "www.example.com" );

由client設定cookie:

1
client.setRequestHeader( "cookie", "name=sparrow;" );

使用cookie常見問題

通常cookie能不能被存取,會依照expires、path、domain、HttpOnly、secure這幾項辨識:

  • expires : cookie的時效性,當時間超過expires設定的日期,這個cookie將會被捨棄。

    1
    expires=Sat, 17-Oct-2015 14:11:09 GMT;
  • path : 在domain下,cookie允許存取的路徑。

    1
    path=/;
  • domain : cookie允許存取的domain。

    1
    2
    3
    4
    domain=.google.com.tw;
    最前面的.指得是子網域皆可存取,例如:
    www.google.com.tw
    ad.google.com.tw
  • HttpOnly : 在瀏覽器下看到這個屬性時,只允許server端操作此cookie,換句話說client雖然存此cookie,卻無權操作,可防止透過xss將cookie偷走。

    1
    HttpOnly
  • secure :只允許在https上操作此cookie,在一般http接無法存取。

    1
    secure;

如果有用到nginx、apache這類的server去做proxy,需要檢查path或domain,才不會遇到cookie無效的狀況。

解析response的header

在android的device,如果想要取得header的內容可以使用allResponseHeaders,雖然titanium有提供getResponseHeader的功能,實際使用過都無法取得到值。

在onload取值:

1
2
3
4
client.onload = function(){

Ti.API.info( client.allResponseHeaders );
};

如果你想取得一個header的json,可以實作一個類似這種function:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

/**
* @param {*} ary
* @type boolean
*/
var isArray = function( ary ){

return Object.prototype.toString.call( ary ) === "[object Array]";
};

/**
* @param {String} allResHeaders
* @type Object
*/
var getHeaders = function( allResHeaders ){

var result = {},

headerStrs = allResHeaders.split( "\n" );

for ( var index in headerStrs ) {

if ( headerStrs[index] ) {

var header = result[index].split( ":", 2 ),

name = header[0].toLowerCase(),

value = header[1];

if ( result[name] && !isArray( result[name] ) ) result[name] = [ result[name], value];

else if ( isArray( result[name] ) ) result[name].push( value );

else result[name] = value;

}
}

return result;
};

透過getHeaders取值:

1
2
var headers = getHeaders( client.allResponseHeaders );
Ti.API.info( headers );