# ajax(对ajax函数封装)
## 一:使用方法
之前用 `fnList(ret)` ,现在改为 `fnList(ret.data.info)`
## 二:示例
![](https://box.kancloud.cn/53fdaf18b5ca0e8f44e470bd5ee37b5f_1093x539.png)
```
//ajax获取文章分类
function Terms_list() {
ajax({
url: domainName + '/index.php?g=App&m=Article&a=articleTerms',
method: 'get'
}, function(ret, err) {
if (ret) {
fnList_terms(ret.data.info);//新的
//fnList_terms(ret);//旧的
} else {
api.toast({
msg: '网络错误'+'网络请求:'+err.statusCode+'错误码:'+err.code,
duration: 2000,
location: 'middle'
});
}
});
}
```
## 三:函数源码
```js
/**
* [ajax 封装api.ajax加入自定义HTTP请求头,以实现APP身份验证和模拟SESSION机制]
* 使用方法与api.ajax完全一样
* @author Baiyu
* @param {[object]} parmas [参数对象]
* @param {[function]} callback [回调函数]
*/
function ajax(params, callback){
if(!api){
console.log('只能运行在APICLOUD环境下');
return false;
}
//返回所有http响应头信息
var needReturnAll = false;
if (params.returnAll) {//调用者需要返回所有结果
needReturnAll = true;
} else {//调用者不需要返回所有结果但系统需要
params.returnAll = true;
}
//请求头加入APP身份识别码
if (!params.headers) {
params.headers = {};
}
params.headers.NEWAPPAUTH = api.getPrefs({
sync : true,
key : 'NEWAPPAUTH'
});
//请求头加入模拟SESSID
var newSessId = api.getPrefs({
sync : true,
key : 'NEWSESSID'
});
if (newSessId) {
params.headers.NEWSESSID = newSessId;
}
//发起ajax请求
api.ajax(params, function(ret, err){
//未出错时处理response中的Set-Cookie,截取并保存到Prefs
if (!err) {
var headers = ret.headers;
var statusCode = ret.statusCode;
if (headers['Set-Cookie']) {
var sessionArr = headers['Set-Cookie'].match(/NEWSESSID=[\w\d]+/g);
for(var i in sessionArr){
var data = sessionArr[i].split('=');
var sessionId = $api.trim(data[1]);
api.removePrefs({
key : 'NEWSESSID'
});
if (sessionId != 'deleted') {
api.setPrefs({
key : 'NEWSESSID',
value : sessionId
});
}
}
}
//如果服务器返回201错误代码,表明需要重新登录,这里发送重新登录事件,index.html中会接收到并处理
if (ret.error == 201) {
api.removePrefs({
key : 'NEWSESSID'
});
api.sendEvent({
name: 'reLogin'
});
return false;
}
}
var ret = !needReturnAll && !err ? ret.body : ret;//根据调用者是否需要返回所有结果来确定要返回ret还是ret.body
callback.apply(this, [ret, err]);
});
}
```