目录 |
XNJS提供的Ajax对象,供app开发者使用JavaScript完成Ajax的各种操作。
校内开放平台在用户浏览器和app服务器之间提供代理功能。当用户向app服务器发送Ajax请求时,请求会通过校内Ajax代理服务器转发;同样,app服务器的应答也通过校内Ajax代理服务器转发到用户浏览器。
出于安全考虑,校内Ajax对象只支持POST类型的请求。
校内Ajax对象支持三种应答类型:RAW、XNML和JSON。
|
Ajax应答类型 |
编码 |
描述 |
|
RAW |
1 |
app服务器返回一段纯文本。 |
|
XNML |
3 |
app服务器返回一段XNML片段,并以一个XNML_String对象的格式传递给XNJS Ajax对象的ondone函数(开发者定义的callback函数)。可以通过DOM节点的setInnerXNML设置为元素内容,或用来装饰Dialog。 |
|
JSON |
2 |
app服务器返回JSON(JavaScript Object Notation)格式的一段文本。如果JSON对象的某个属性以“xnml_”开头,则属性值是一段XNML文本,同样该属性会成为一个XNML_String对象,传递给XNJS Ajax对象的ondone函数。 |
var ajax = new Ajax(Number responseType);
|
参数名 |
类型 |
描述 |
是否可选 |
默认值 |
|
responseType |
Number |
Ajax应答类型,可以是Ajax.RAW、Ajax.XNML或Ajax.JSON。 |
必选。 |
n/a |
|---|
void post(String url [, Object query, url_mode]);
出于安全考虑,校内Ajax只支持POST类型的请求。
|
参数名 |
类型 |
描述 |
是否可选 |
默认值 |
|
url |
String |
处理ajax请求的URL,根据参数url_mode的取值不同而有不同的限制。当url_mode=false时,它只能是app服务器的URL,即必须和app注册的canvas URL在同一个域下;当url_mode=true时,它必须是canvas URL,即以"http://apps.xiaonei.com/appalias/"开头的URL。在url参数中不推荐使用包含?开头的query string,要提交给app服务器的参数建议请使用第二个参数query来指定,如果url参数中包含?开头的query string,则一律由校内Ajax代理服务器转为POST请求发送给app服务器。 |
必选。 |
n/a |
|---|---|---|---|---|
|
query |
Object |
浏览器提交的post参数是用&隔开的“name=value”的格式。query对象的属性名表示name,属性值表示value。query对象的属性值仍然可以是一个对象,并且支持多级嵌套,提交的post请求则以数组的形式发送给app服务器,详见示例。 |
可选。 |
默认为空。 |
|
url_mode |
Boolean |
设置Ajax的URL模式:如果为false,表示normal模式;如果为true,表示canvas模式。在normal模式下,Ajax只能向与app的callback URL同一域下的URL提交post请求,这种模式对开发者而言更接近真实的Ajax操作;而在canvas URL模式下,则必须向app的canvas URL,即http://apps.xiaonei.com/appalias/...提交post请求,这种模式则可以防止app的callback url暴露给用户。 |
可选。 |
默认为false。 |
ajax.ondone(data);
校内Ajax要求开发者为Ajax对象定义callback函数,即ondone函数,当成功得到Ajax应答时会被调用。对于不同的应答类型,参数data有不同的格式,见下表ondone函数的参数介绍。
|
Ajax应答类型 |
参数data的类型 |
描述 |
|
RAW |
String |
由app服务器返回的未经过任何处理的字符串。 |
|
XNML |
由app服务器返回的XNML片段,经过了校内XNML解析引擎的处理,表示为一个XNML_String对象。 |
|
|
JSON |
Object |
由app服务器返回的JSON文本生成的一个JSON对象。如果这个JSON对象的某个属性以“xnml_”开头,则属性值是代表一段XNML片段的XNML_String对象。 |
ajax.onerror(errobj);
校内Ajax要求开发者为出错情况定义callback函数,即onerror函数,当Ajax请求出错时会被调用。
参数errobj是一个对象,它的属性包含了出错相关的信息。
|
参数errobj的属性 |
类型 |
描述 |
|
error |
Number |
错误码。 |
|
error_message |
String |
错误描述字符串。 |
<script type="text/javascript">
<!--
function app_ajax(type) {
var ajax = new Ajax(type);
ajax.ondone = function(data) {
var ajax_display = document.getElementById('ajax_display');
var json_display = document.getElementById('json_display');
switch (type) {
case Ajax.RAW:
ajax_display.setTextValue(data);
json_display.setTextValue('');
break;
case Ajax.JSON:
var text = 'json.message = ' + data.message;
text += '; json.type = ' + data.type;
text += '; json.user_id = ' + data.user_id;
ajax_display.setTextValue(text);
json_display.setInnerXNML(data.xnml_user);
break;
case Ajax.XNML:
ajax_display.setInnerXNML(data);
json_display.setTextValue('');
break;
}
}
ajax.onerror = function(errobj) {
var ajax_display = document.getElementById('ajax_display');
var errmsg = '!!!<ERROR> error code: ' + errobj.error + '; error description: ' + errobj.error_message;
ajax_display.setTextValue(errmsg);
}
var params = {
type: type,
user_id: Session.getUser(),
param3: {in_param1: '333_111', in_param2: '333_222'}
};
ajax.post('http://www.leo.com/xnmlshell/demo/ajax_handler/ajax_all.jsp', params);
}
//-->
</script>
<p><a href="#" onclick="app_ajax(Ajax.RAW); return false;">RAW</a></p>
<p><a href="#" onclick="app_ajax(Ajax.XNML); return false;">XNML</a></p>
<p><a href="#" onclick="app_ajax(Ajax.JSON); return false;">JSON</a></p>
<div id="ajax_display"></div>
<div id="json_display"></div>
点击上面的链接就会发送ajax请求,发送到app服务器的POST请求会是与下面类似的格式:
type=1&user_id=1234567¶m3[in_param1]=333_111¶m3[in_param2]=333_222
下面是一段jsp的代码样例,用于处理ajax请求。
<%
String type = request.getParameter("type");
if (type == null) {
type = "";
}
String user_id = request.getParameter("user_id");
if (user_id == null) {
user_id = "";
}
String param3_in1 = request.getParameter("param3[in_param1]");
if (param3_in1 == null) {
param3_in1 = "";
}
String param3_in2 = request.getParameter("param3[in_param2]");
if (param3_in2 == null) {
param3_in2 = "";
}
StringBuffer value = new StringBuffer(128);
if (type.equals("1")){//RAW
value.append("返回RAW字符串,type = ");
value.append(type);
value.append("; user_id = ");
value.append(user_id);
value.append("; param3[in_param1] = ");
value.append(param3_in1);
value.append("; param3[in_param2] = ");
value.append(param3_in2);
out.println(value);
}
else if (type.equals("2")){//JSON
value.append("{\"type\": ");
value.append(type);
value.append(", \"user_id\": ");
value.append(user_id);
value.append(", \"message\": \"返回了JSON对象\"");
value.append(", \"xnml_user\": \"你好,这是你的个人主页: <xn:profile-pic uid=\\\"loggedinuser\\\"
linked=\\\"true\\\"/>\"");
value.append("}");
out.println(value);
}
else if (type.equals("3")){//XNML
value.append("返回XNML片段,type = ");
value.append(type);
value.append("; param3[in_param1] = ");
value.append(param3_in1);
value.append("; param3[in_param2] = ");
value.append(param3_in2);
value.append(";你好,<xn:name uid=\"");
value.append(user_id);
value.append("\" linked=\"true\"/>");
out.println(value);
}
else {//Unknown type
out.println("Unknown type detected!");
}
%>