为了让用户体验更好,页面前端往往是通过ajax来进行数据处理;由于浏览器的设计原因每个域名下的连接有限,这样导致了同时进行ajax数据请求效率无法得到有效地提升,为了提高效率和传统HTTP协议上的限制,因此websocket的应运而生。由于websocket是后期提供的升级协议,所以现有很多WEB服务逻辑无法同时兼容两种协议处理;导致了页面前端就无法更有效地利用websocket优势,更多的是在这两者间做一种选择。

FastHttpApi

为了更好地利用websocket的优势和传统性兼容,FastHttpApi实现无缝兼容Ajax和Websocket数据请求,开发者只需要写一分服务端代码!更重要的是FastHttpApi可以让开发者完全不用写Javascript调用的API脚本!在新版本的FastHttpApi中实现了一个自定义工具,只要设置好这个自定义工具开发者在VS编写逻辑控制器的情况下就自动生成对应调用的API脚本文件。插件安装说明

脚本调用机制

当编写完成逻辑控制器后,就可以把对应的脚本引用到网页上(生成脚本还支持await调用),直接调用相关方法即可。

 var result = await $ListEmployees();
var empsBlock = new Vue({
el: '#lstbody',
data: result
});

组件脚本默认是隐藏了调用方式,使用者并不用去关心其中细节(具本可以看FastHttpApi代码了解);当组件探测到有可用的websocket连接的时候就会自动使用websocket进行数据请求,这样对于有多个数据块同时加载的时候比传统的ajax有着更高效的通讯优势。如果websocket不可用或还没初始化完成时,那组件就会自动使用传统的ajax模式进行处理。

示例实现

为了更好地体现FastHttpApi在这方面的功能,以下针对Northwind的订单业务进行一个分页查询。

控制器代码
        /// <summary>
/// 订单查询
/// </summary>
/// <param name="employeeid">雇员ID</param>
/// <param name="customerid">客户ID</param>
/// <param name="index">分页索引</param>
/// <returns>{Index:0,Pages:0,Items:[order],Count:0}</returns>
public object ListOrders(int employeeid, string customerid, int index, IHttpContext context)
{
Func<Order, bool> exp = o => (employeeid == || o.EmployeeID == employeeid)
&& (string.IsNullOrEmpty(customerid) || o.CustomerID == customerid);
int count = mOrders.Count(exp);
int size = ;
int pages = count / size;
if (count % size > )
pages++;
var items = mOrders.Where(exp).Skip(index * size).Take(size);
return new { Index = index, Pages = pages, Items = items, Count = count };
}

以上是针对一个订单分析查询的逻辑方法,在编写完成逻辑控制器后在相应代码文件属性->自定义工具输入'JASPI'即可生成对应的javascript脚本:

var $ListOrders$url='/listorders';
///<summary>
/// 订单查询
/// </summary>
/// <param name="employeeid">雇员ID</param>
/// <param name="customerid">客户ID</param>
/// <param name="index">分页索引</param>
/// <returns>{Index:0,Pages:0,Items:[order],Count:0}</returns>
function $ListOrders(employeeid,customerid,index,useHttp)
{
return api($ListOrders$url,{employeeid:employeeid,customerid:customerid,index:index},useHttp).sync();
}
function $ListOrders$async(employeeid,customerid,index,useHttp)
{
return api($ListOrders$url,{employeeid:employeeid,customerid:customerid,index:index},useHttp);
}

以上代码都是插件自动生成,如果控制器方法有注释同样也会生成到JS中,开发完全只需要把脚本文件引用到页面即可。插件针对控制生成了两个方法,一个同步一个异步;同步方法是支持await调用,异步方法则在调用过程中指定Callback函数;其中useHttp参数是强行指定使用ajax请求。

页面集成

FastHttpApi是不支持服务端视图引擎,所以只能使用前端框架来整合页面,在这里选择了VueJS(这个框架的确不错,功能丰富入门简单即看即用)。在VueJS的支撑下页面代码就变得比较简单

 <form class="form-inline">
<div class="form-group">
<label for="exampleInputName2">Employee:</label>
<select id="lstEmployees" style="margin:5px;">
<option value=""></option>
<option v-for="item in Data" v-bind:value="item.ID">{{item.Name}}</option>
</select>
</div>
<div class="form-group">
<label for="exampleInputEmail2">Customer:</label>
<select id="lstCustomers" style="margin:5px;">
<option value=""></option>
<option v-for="item in Data" v-bind:value="item.ID">{{item.Name}}</option>
</select>
</div>
<br />
<button type="button" onclick="searchOrder(0)" class="btn btn-default">Search</button>
</form>
<table class="table">
<thead>
<tr>
<th>#</th>
<th>OrderID</th>
<th>ShipName</th>
<th>ShipAddress</th>
<th>City</th>
<th>OrderDate</th>
</tr>
</thead>
<tbody id="lstbody">
<tr v-for="item in Data.Items">
<td></td>
<td>{{item.OrderID}}</td>
<td>{{item.ShipName}}</td>
<td>{{item.ShipAddress}}</td>
<td>{{item.City}}</td>
<td>{{item.OrderDate}}</td>
</tr>
</tbody>
</table>
<nav aria-label="Page navigation">
<ul id="pagination" class="pagination"> </ul>
</nav>

页面功能整合了雇佣员、客户两个下选择条件,订单信息显示和分页。接下来整全的javascrip脚就更简单了:

 var app6;
$(document).ready(function () {
app6 = new Vue({
el: '#lstbody',
data: { Data: [] }
});
init();
}); async function init() {
var result = await $GetEmployeesName();
var app4 = new Vue({
el: '#lstEmployees',
data: result
}); result = await $GetCustomersName();
var app5 = new Vue({
el: '#lstCustomers',
data: result
});
searchOrder(0);
} async function searchOrder(index) {
var result = await $ListOrders($('#lstEmployees').val(), $('#lstCustomers').val(), index);
app6.Data = result.Data;
pagination(index, result.Data.Pages);
}

实际处理效果

这个页面一开始就分别加载3项数据,如果按传统的ajax加载来看一般都串行加载,后前等前才完成后才能请求加载。当在FastHttpApi的支撑下结果又怎样呢,我们看一下整个页面的加载情况: 

从图上我们可以看到,由于websocket没有初始化完成,所以获取雇员的数据是直接ajax了,后面的客户和默认订单查询走了websocket通讯。如果页面有大量数据块整合的情况,那使用FastHttpApi会有很大的加载效率优势。

了解更多FastHttpApi

项目地址:https://github.com/IKende/FastHttpApi

完全基于FastHttpApi实现的官方网站:http://www.ikende.com

实现无缝兼容ajax/websocket网页应用和服务的更多相关文章

  1. Spring之WebSocket网页聊天以及服务器推送

    Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...

  2. 网站图片无缝兼容 WebP/AVIF

    前言 WebP 格式发布已有十余年,但不少站点至今仍未使用,只为兼顾极少数低版本浏览器.至于去年发布的 AVIF 格式,使用的站点就更少了. 然而图片往往是流量大户,与其费尽心机优化脚本体积,可能还不 ...

  3. nodejs利用ajax实现网页无刷新上传图片

    nodejs利用ajax实现网页无刷新上传图片 标签(空格分隔): nodejs 通常情况下上传图片是要通过提交form表单来实现的,但是这又不可避免的产生了网页转. 利用ajax技术和FormDat ...

  4. 分享基于 websocket 网页端聊天室

    博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...

  5. WebSocket 网页聊天室

    先给大家开一个原始的websocket的连接使用范例 <?php /* * recv是从套接口接收数据,也就是拿过来,但是不知道是什么 * read是读取拿过来的数据,就是要知道recv过来的是 ...

  6. 模拟websocket推送消息服务mock工具二

    模拟websocket推送消息服务mock工具二 在上一篇博文中有提到<使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock>使用electron创建一个模拟后 ...

  7. 网页启动Windows服务

    如何在网页启动Windows服务   由于公司有许多windows服务进行业务的处理,所谓对服务的维护也是一个比较头痛的问题,因为自己也不知道服务什么时候自动停了,而且更主要的原因是服务都是由运维部门 ...

  8. 通过 jsp+ajax+servlet+webservice 远程访问天气预报服务

    通过 jsp+ajax+servlet+webservice 远程访问天气预报服务   - webservice 客户端访问的方式     1. java代码来访问     2. ajax 方式异步加 ...

  9. 镜像回源主要用于无缝迁移数据到OSS,即服务已经在自己建立的源站或者在其他云产品上运行,需要迁移到OSS上,但是又不能停止服务,此时可利用镜像回写功能实现。

    管理回源设置_管理文件_开发指南_对象存储 OSS-阿里云 https://help.aliyun.com/document_detail/31865.html 通过回源设置,对于获取数据的请求以多种 ...

随机推荐

  1. OO Unit 1 表达式求导

    OO Unit 1 表达式求导 面向对象学习小结 前言 本博主要内容目录: 基于度量来分析⾃己的程序结构 缺点反思 重构想法 关于BUG 自己程序出现过的BUG 分析⾃己发现别人程序bug所采⽤的策略 ...

  2. 从Facebook数据泄露事件看大数据时代的个人信息安全问题

    进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...

  3. 一道令人抓狂的零一背包变式 -- UVA 12563 Jin Ge Jin Qu hao

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  4. Java下载文件的几种方式

    转发自博客园Sunny的文章 1.以流的方式下载 public HttpServletResponse download(String path, HttpServletResponse respon ...

  5. itunes 备份导致C盘空间不足问题解决办法

    首先,itunes备份的默认路径是 C:\users\你的用户名\Appdata\Roaming\Apple computer 备份的主要存放文件在C:\Users\David_lu\AppData\ ...

  6. http 缓存学习.

    mark 一下 HTTP 缓存机制一二三 http://web.jobbole.com/92773/ 彻底弄懂HTTP缓存机制及原理 https://www.cnblogs.com/chenqf/p/ ...

  7. ztree设置节点checked,选中某节点等相关操作

    ztree设置节点checked,选中某节点等相关操作 1.根据id获取树的某个节点: var zTree = $.fn.zTree.getZTreeObj("mytree"); ...

  8. 五、JAVA反射、线程

    第五节:Java反射.线程 线程   1.进程:进程是程序的基本执行实体,进程是线程的容器.    线程:被称为轻量进程,是程序执行流的最小单元.线程是进程中的一个实                  ...

  9. matlab安装 macos

    http://pan.baidu.com/s/1o6qKdxo内附安装说明Matlab R2014A Mac & Linux 破解版 readme文件有流程!可以安装

  10. 口袋appnabcd

    N(need)需求:依据我们学习经历的情况而言,对于初次接触的专业的学生来说,对学习的方向上会感到迷茫,不知道如何学习以及不知道学什么.比如对于计算机专业来说,对于一些软件的选择和下载,应用环境配置等 ...