§ Fox2.0前端框架-服务请求
§ 1.同步通信
Fox框架提供了同步请求服务的方法,该在PC上调试的时候由于受限浏览器,无法正常打开cover,但是在Fox外壳中运行时是有cover的。
方法名 fox.service.request
参数
- id 用于防止重复提交,也就是在如果两个服务的ID一致,那么在有一个服务未返回,那么另一个服务的提交是无效的。
- name 服务名,格式package/namespace/name
- async 是否异步,默认是异步
- data 请求数据,格式为json对象
例子
//同步通讯测试
let res=fox.service.request({
id:"1",
name:"demo/login/login",
async:false,
data:{
user:"test",
pass:"123456"
}
});
if(res.code == '0'){
console.info("登录成功,data:"+JSON.stringify(res.data));
}else{
console.info("登录失败,data:"+res.message);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
§ 2.异步通信
异步请求,代码不会停留在服务调用初,我们需要在回调函数中处理结果。
方法名 fox.service.request
参数
- id 用于防止重复提交,也就是在如果两个服务的ID一致,那么在有一个服务未返回,那么另一个服务的提交是无效的。
- name 服务名,格式package/namespace/name async 为true默认是异步 data 请求数据,格式为json对象
- callback 回调函数,参数为code、message、data,其中code为0的时候代表正确,其他都是错误,message是code为非0的时候的错误信息,data是在code为0的时候的数据
例子
//异步步通讯测试
fox.service.request({
id:"1",
name:"demo/login/login",
data:{
user:"test",
pass:"123456"
},
callback:function(code,message,data){
if(code == '0'){
console.info("登录成功,data:"+JSON.stringify(data));
}else{
console.info("登录失败,data:"+message);
}
//同步通讯测试
let res=fox.service.request({
id:"1",
name:"demo/demo/demoService",
async:false,
data:{
name:"女神"
}
});
if(res.code == '0'){
console.info("请求成功,data:"+JSON.stringify(res.data));
}else{
console.info("请求失败,data:"+res.message);
}
}
});
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
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
§ 3.与其他服务器通信
上两节介绍到的同步通信、异步通信都是与fox服务通信,会在公共方法中根据服务名拼装url请求路径。 对于一些服务并非fox服务的场景下,显然这一方式就不适用了,那么fox前端框架也具备与其他服务器通信的方法 在fox.request方法中增加path或者requestUrl字段
- path :将请求路径与config.js中配置的ip:port拼装在一起
- requestUrl :完整的请求路径,不再与config.js中的ip拼装
path 示例
//异步步通讯测试
fox.service.request({
id:"1",
path: "demo/login/login.action", //服务示例,在公共层会拼装上ip和端口,如http://beijing.btop.mobi:9700/demo/login/login.action
data:{
user:"test",
pass:"123456"
},
callback:function(code,message,data){
if(code == '0'){
console.info("登录成功,data:"+JSON.stringify(data));
}else{
console.info("登录失败,data:"+message);
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
requestUrl 示例
//异步步通讯测试
fox.service.request({
id:"1",
requestUrl: "http://beijing.btop.mobi:9700/demo/login/login.action", //直接访问的url地址
data:{
user:"test",
pass:"123456"
},
callback:function(code,message,data){
if(code == '0'){
console.info("登录成功,data:"+JSON.stringify(data));
}else{
console.info("登录失败,data:"+message);
}
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
§ 4.服务请求过滤器
在请求服务之前和之后,都会经过过滤器处理,对数据进行拆包组包操作
服务请求过滤器在custom/main.js文件中添加
默认带有messageParser过滤器,用于访问fox服务
如访问其他服务,可以自行修改过滤器
过滤器代码
//加入请求过滤器
fox.service.addFilter({
//过滤器名称
name: "messageParser",
//请求前触发
before: function (event) {
//定义请求头
var tellerInfo = fox.sessionStorage.get("tellerInfo");
//定义请求数据
var reqData = {
//请求头
header: { tellerInfo: tellerInfo },
//请求数据
data: event.data
};
//保存导出数据
event.code = 0;
event.data = reqData;
// 返回处理标志,true则继续处理,false则中断处理
return true;
},
//数据返回后触发
after: function (event) {
//只处理JSON对象
if (fox.type(event.data) == "object" && fox.type(event.data.header) != "undefined") {
//获取响应头
var rspHeader = event.data.header;
//获取响应数据
var rspData = event.data.data;
if (fox.type(rspHeader.code) == "undefined" || rspHeader.code == 0) {
//保存导出数据
event.code = 0;
event.message = "";
event.data = rspData;
//返回处理标志,true则继续处理,false则中断处理
return true;
} else {
//保存导出数据
event.code = rspHeader.code;
event.message = rspHeader.msg;
event.data = rspData;
//返回处理标志,true则继续处理,false则中断处理
return true;
}
}
//返回处理标志,true则继续处理,false则中断处理
return true;
},
//异常发生后触发
exception: function (event) {
//获取url
var url = window.location.toString();
if ("unlogin" == event.message) {
//返回处理标志,true则继续处理,false则中断处理
return false;
}
//重复提交处理
if ("resubmit" == event.message) {
fox.logger.error("resubmit error");
//返回处理标志,true则继续处理,false则中断处理
return false;
}
//返回处理标志,true则继续处理,false则中断处理
return true;
}
});
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
§ 5.消息服务(websocket)
消息服务用于监听服务端推送给客户端的消息
TIP
注册消息服务之前必须要登录,不然无法建立连接
§ 5.1注册
提供注册服务接口,当服务注册成功后会回调函数,函数中有两个参数:name服务名,data是一个json对象,分别有属性msgType和content msgType:分别有#info和#notice,其中当消息类型为#info为第一连接成功后,其消息的content为服务端返回的唯一ID,后面服务端可以通过该ID发送消息到客户端对应的服务。 content:为消息的内容
例子
//注销
fox.service.unRegisterMessageService("demo");
//注册
fox.service.registerMessageService("demo", function (name, data) {
//处理information消息
if (data.msgType == "#info") {
//记录地址,该地址用于服务端向客户端推送消息
var address = data.content;
fox.logger.info("1.建立连接,返回标识地址:" + address);
fox.service.request({
name: "demo/demo/webSocket",
data: {"address": address},
callback: function (code, message, content) {
fox.logger.info("2.标识地址记录成功:" + JSON.stringify(content));
}
})
}else {
fox.layer.open("web socket通知:" + data.content);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
§ 5.2注销
提供了服务注销接口
例子
fox.service.unRegisterMessageService("demo");
1
§ 5.3获取消息服务ID
可通过服务名获取服务对应的唯一ID
例子
fox.service.getMessageServiceId("demo");
1
§ 5.4服务端推送消息
//根据用户号查询数据库,获取到客户端地址
String address = "H_*"; //websocket的地址以H_开头
// 获取message sender
IMessageSenderDelegate messageSender = this
.getDelegate(IMessageSenderDelegate.class);
// 发送消息
messageSender.notify(address, "http", "http", msg);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8