XCO请求


XCO请求是基于AJAX的异步请求,和普通的AJAX请求区别在于:

  1. contentType为application/xco;charset=utf-8
  2. 请求方式为POST
  3. 请求参数位于BODY体内,数据格式为XCO对象序列化后的XML字符串;

xco.jquery-{version}.js提供了XCO请求的具体实现,从名字上我们大致可以看出,XCO请求从实现角度,是基于jquery的,因此在使用XCO请求的时候,我们也需要引入jquery类库。

1. 使用示例

<button type="button" name="t1" onclick="doSubmit()">XCO请求</button>

<script type="text/javascript" src="/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="/js/xco-1.0.1.js"></script>
<script type="text/javascript" src="/js/xco.jquery-1.0.1.js"></script>
<script type="text/javascript">
    function doSubmit() {
       var xco = new XCO();
       xco.setIntegerValue("id", 1);
       xco.setStringValue("name", "张三");
       var options = {
         url : "/m1.xco",     //请求的URL地址
         data : xco,          //请求的参数,必须为XCO对象
         success : doCallBack //成功后的回调函数
       };
       $.doXcoRequest(options);
    }
    function doCallBack(data) {
       // 这里的data是一个XCO对象
       alert('doCallBack:\n' + data);
    }
</script>

说明:关于服务端的接收和处理,可参考http://www.xson.org/project/web/1.2.0/

2. 成功处理

对于请求成功后的处理,XCO请求还提供多回调函数的支持。

function doSubmit() {
    var xco = new XCO();
    xco.setIntegerValue("id", 1);
    xco.setStringValue("name", "张三");
    var options = {
       url : "/m1.xco",   //请求的URL地址
       data : xco,          //请求的参数,必须为XCO对象
       success : [ doCallBack1, doCallBack2, doCallBack3 ]
    };
    $.doXcoRequest(options);
}

function doCallBack1(data) {
    // TODO
}
function doCallBack2(data) {
    // TODO
}
function doCallBack3(data) {
    // TODO
}

3. 结果检测

XCO请求返回的结果是一个XCO对象,我们可以通过XCO对象的getCode方法拿到请求的状态代码(一般情况下,0代表处理成功,非0代表处理失败),通过getMessage方法拿到错误信息。对于返回结果,我们往往会先检测其状态代码,然后再做业务处理;我们先看一个示例:

示例1

function doCallBack(data) {
    if(1 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码1
       return;
    }
    if(2 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码2
       return;
    }
    ...
    if(0 == data.getCode()){
       // 处理正常业务
    }
}

现在,我们可以使用另一种方式来实现上面的功能:

示例2

function doSubmit() {
    var xco = new XCO();
    xco.setIntegerValue("id", 1);
    xco.setStringValue("name", "张三");
    var options = {
       url : "/m1.xco",   //请求的URL地址
       data : xco,          //请求的参数,必须为XCO对象
       success : doCallBack, //成功后的回调函数
       detector : doDetector //结果检测:该函数只有返回true,success回调才会执行
    };
    $.doXcoRequest(options);
}

function doDetector(data) {
    if(0 == data.getCode()){
       return true;
    }
    if(1 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码1
    } else if(2 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码2
    }
    return false;
}

function doCallBack(data) {
    // 处理正常业务
}

示例3

function doSubmit() {
    var xco = new XCO();
    xco.setIntegerValue("id", 1);
    xco.setStringValue("name", "张三");
    var options = {
       url : "/m1.xco",   //请求的URL地址
       data : xco,          //请求的参数,必须为XCO对象
       success : doCallBack, //成功后的回调函数
       detector : [doDetector1, doDetector2]
    };
    $.doXcoRequest(options);
}
function doDetector1(data) {
    if(1 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码1
       return false;
    } 
    return true;
}
function doDetector2(data) {
    if(2 == data.getCode()){
       alert(data.getMessage());
       // 处理错误码2
       return false;
    } 
    return true;
}

示例3中,我们使用了两个结果检测函数,只有这两个检测函数都返回true,success回调才会执行,任何一个检测函数返回false,都将结束回调流程。

如果我们希望先检测code是否为0,如果为0后续则无需再做检测,该如何做呢?我们可以将示例3中的代码做如下改动:

function doDetector1(data) {
    if(0 == data.getCode()){
       return IGNORE_FOLLOW_UP;  //返回特殊标记,忽略后续结果检测
    }
    // 其他结果检测
}