AJAX API
Javascript 2012. 5. 4. 15:09
이전 포스트에서 우리는 AJAX 대한 정의와 XHR 객체 맴버에 대해 알아보았습니다.
이번 시간에는 그 내용을 바탕으로 AJAX API 코드를 작성하고 코드에 설명해 드리도록 하겠습니다.
아래는 작성된 AJAX API 전체 소스입니다.
-
var Ajax = (function(win, doc){
-
-
var ua = window.navigator.userAgent.toLowerCase();
-
-
return { request: function(opt){ return new request(opt); } };
-
-
// 요청
-
function request(opt)
-
{
-
-
this.options = {
-
-
url: '',
-
type: 'html',
-
method: 'post',
-
headers: {},
-
data: {},
-
callback: function(){ ; }
-
};
-
-
extend.call(this.options, opt);
-
start.call(this.options);
-
-
return this;
-
};
-
-
-
function start(){
-
-
if (!this.url) return false;
-
-
var xhr = getXHR()
-
, params = getParamsSerialize(this.data);
-
-
var method = this.method = this.method.toLowerCase();
-
-
var url = (method === 'get' && params) ? this.url + '?' + params + '&s=' + encodeURIComponent(new Date().toUTCString()) : this.url;
-
-
xhr.open(method, url, true);
-
-
setHeaders.call(xhr, this.headers);
-
-
if (xhr.overrideMimeType) setHeaders.call(xhr, { 'Connection': 'close' });
-
-
(function($this){ xhr.onreadystatechange = function(){ handler.call($this, xhr); }; })(this);
-
-
-
if (method === 'get') xhr.send(null);
-
else if (method === 'post') xhr.send(params + '&s=' + encodeURIComponent(new Date().toUTCString()));
-
}
-
-
-
// xhr 객체 가져오기
-
function getXHR(){
-
/*
-
ie5 : Microsoft.XMLHTTP,
-
ie6+ : Msxml2.XMLHTTP,
-
비 IE : XMLHttpRequest
-
*/
-
if (!window.XMLHttpRequest) return new ActiveXObject(ua.indexOf('msie 5') > -1 ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP');
-
else if (window.XMLHttpRequest) return new XMLHttpRequest;
-
-
};
-
-
-
// 파라메터 직렬화
-
function getParamsSerialize(data) {
-
-
var ret = [];
-
-
for (var p in data) ret.push(p + '=' + encodeURIComponent(data[p]));
-
-
};
-
-
// 요청 헤더 추가
-
function setHeaders(heders){
-
-
for (var h in heders) if (heders[h] !== '') this.setRequestHeader(h, heders[h]);
-
-
};
-
-
// 응답 헨들러
-
function handler(x){
-
-
if (x.readyState === 4){
-
-
if (error(x.status)) alert('request Error' + x.status);
-
else this.callback.apply(x, [getXhrData.call(this, x), x.status]);
-
}
-
};
-
-
-
// 서버 에러 유/무
-
function error(s){
-
-
return !s && window.location.protocol === 'file:' ? false : s >= 200 && s < 300 ? false : s === 304 ? false : true;
-
};
-
-
// 수신받은 결과값 가공 함수
-
function getXhrData(x)
-
{
-
-
var contentType = x.getResponseHeader('content-type')
-
, xml = contentType && contentType.indexOf('xml') > -1
-
, json = contentType && contentType.indexOf('json') > -1;
-
-
var type = this.type.toLowerCase();
-
-
if (xml && type === 'xml') return x.responseXML;
-
else if (type === 'text') return x.responseText.replace(/<(\/)?([a-zA-Z]*)(\s[a-zA-Z]*=[^>]*)?(\s)*(\/)?>/g, '');
-
else return x.responseText; // html */*
-
-
};
-
-
// 객체 상속 함수
-
function extend(){
-
-
var target = this
-
, opts = []
-
, src = null
-
-
for (var i = 0, length = arguments.length; i < length; i++) {
-
-
opts = arguments[i];
-
-
for (var n in opts) {
-
src = target[n];
-
-
}
-
}
-
};
-
-
})(window, document);
API 실행 함수
-
function ajax()
-
{
-
Ajax.request({
-
url: 'http://sof.fpscamp.com',
-
type: 'text',
-
method: 'post',
-
'content-type': 'application/x-www-form-urlencoded'
-
},
-
data: {
-
id: 'id1'
-
},
-
callback: function(data, status){
-
//alert(data);
-
alert(status);
-
}
-
});
-
-
Ajax.request({
-
url: 'http://sof.fpscamp.com',
-
type: 'text',
-
method: 'post',
-
'content-type': 'application/x-www-form-urlencoded'
-
},
-
data: {
-
id: 'id2'
-
},
-
callback: function(data, status){
-
//alert(data);
-
//alert(status);
-
alert(this.abort);
-
}
-
});
-
};
API 맴버 설명:
- 호환 가능한 XHR 객체를 가져오는 함수이며, 즉, 브라우저(버전 포함)에 따라 반환되는 객체가 달라집니다.
-
function getXHR(){
-
/*
-
ie5 : Microsoft.XMLHTTP,
-
ie6 ~ ie? : Msxml2.XMLHTTP,
-
표준 브라우저(IE 브라우저 제외) : XMLHttpRequest
-
*/
-
if (!window.XMLHttpRequest) return new ActiveXObject(ua.indexOf('msie 5') > -1 ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP');
-
else if (window.XMLHttpRequest) return new XMLHttpRequest;
-
-
};
- 전송 될 데이터 객체를 파라메터 문자열로 직렬화 시키는 함수
-
function getParamsSerialize(data) {
-
-
var ret = [];
-
-
for (var p in data) ret.push(p + '=' + encodeURIComponent(data[p]));
-
-
};
-
- 요청 HTTP Header 정의 함수
-
function setHeaders(heders){
-
-
for (var h in heders) if (heders[h] !== '') this.setRequestHeader(h, heders[h]);
-
-
};
- 응답에 대한 상태값을 검증하여 완료 시 전달받은 callback 함수를 호출합니다.
-
function handler(x){
-
-
if (x.readyState === 4){
-
-
if (error(x.status)) alert('request Error' + x.status);
-
else this.callback.apply(x, [getXhrData.call(this, x), x.status]);
-
}
-
};
응답에 대한 상태값을 확인 후 에러 유/무를 반환합니다.
-
function error(s){
-
-
return !s && window.location.protocol === 'file:' ? false : s >= 200 && s < 300 ? false : s === 304 ? false : true;
-
};
- 전달받은 요청 타입과 응답 Content-Type을 비교하여 해당 Content-Type으로 가공하여 반환합니다.
-
function getXhrData(x)
-
{
-
-
var contentType = x.getResponseHeader('content-type')
-
, xml = contentType && contentType.indexOf('xml') > -1
-
, json = contentType && contentType.indexOf('json') > -1;
-
-
var type = this.type.toLowerCase();
-
-
if (xml && type === 'xml') return x.responseXML;
-
else if (type === 'text') return x.responseText.replace(/<(\/)?([a-zA-Z]*)(\s[a-zA-Z]*=[^>]*)?(\s)*(\/)?>/g, '');
-
else return x.responseText; // html */*
-
-
};