§ Fox2.0前端框架-服务请求


§ 1.同步通信

Fox框架提供了同步请求服务的方法,该在PC上调试的时候由于受限浏览器,无法正常打开cover,但是在Fox外壳中运行时是有cover的。

方法名 fox.service.request
参数

  1. id 用于防止重复提交,也就是在如果两个服务的ID一致,那么在有一个服务未返回,那么另一个服务的提交是无效的。
  2. name 服务名,格式package/namespace/name
  3. async 是否异步,默认是异步
  4. 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.异步通信

异步请求,代码不会停留在服务调用初,我们需要在回调函数中处理结果。 方法名 fox.service.request
参数

  1. id 用于防止重复提交,也就是在如果两个服务的ID一致,那么在有一个服务未返回,那么另一个服务的提交是无效的。
  2. name 服务名,格式package/namespace/name async 为true默认是异步 data 请求数据,格式为json对象
  3. 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

§ 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

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

§ 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

§ 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

§ 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
最后更新于: 4/15/2022, 2:41:22 PM