在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致,具体可以在解释Body上有所不同。FastHttpApi在实现过程完全支持http协议升级成websocket协议,当制定一个基于http请求的接口时,其实已经是完全支持websocket协议;从而让使用者只编写一份代码即可同时接受两种协议处理。接下来还是以Northwind的数据来描述FastHttpApi制定相应服务开发。

接口制定

对于FastHttpApi定义一个可访问的Http接口是一件非常简单的事情,和定义一个逻辑方法没有多大的差异;以下是定义一个订单查询逻辑的http接口,返回Json格式的数据。

    [BeetleX.FastHttpApi.Controller]
public class Controller
{
public object GetEmployeesName()
{
return from e in mEmployees select new { ID = e.EmployeeID, Name = e.FirstName + " " + e.LastName };
}
public object GetCustomersName()
{
return from c in mCustomers select new { ID = c.CustomerID, Name = c.CompanyName };
}
public object ListOrders(int employeeid, string customerid, IHttpContext context)
{
return mOrders.Where(o =>
(employeeid == || o.EmployeeID == employeeid)
&&
(string.IsNullOrEmpty(customerid) || o.CustomerID == customerid));
}
}

以上代码定义了三个Http请求:

  1. /GetEmployeesName 获取雇员的ID和名称列表
  2. /GetCustomersName 获取客户的ID和名称列表
  3. /ListOrders 查询相应雇员和客户的订单信息 在浏览器上直接访问/GetEmployeesName的数据结果

FastHttpApi对接口响应有默认的Json格式返回,Code为HTTP返回的状态码,200为正常,如果不是200那会带上Error信息,Data则是具体响应的数据内容,Url则是对应请求的基础地址。

页面Ajax请求接口

既然通过浏览器访问没有问题,那接下来就可以通过Ajax进行数据请求了;以下是通过ajax调用/GetEmployeesName/GetCustomersName两个方法。

        $.get("/GetEmployeesName", function (result) {
a = result.Data;
a.forEach(function (v, i) {
$('#lstEmployees').append(' <option value="' + v.ID + '">' + v.Name + '</option>')
});
});
$.get("/GetCustomersName", function (result) {
a = result.Data;
a.forEach(function (v, i) {
$('#lstCustomers').append(' <option value="' + v.ID + '">' + v.Name + '</option>')
});
});

请求数据后绑定到select控件上,这种是相当原始的设置模式了,相信现有的web前端组件已经不需要这么麻烦的工作了:)

订单查询

  function HttpSearch() {
$.get('/listorders?employeeid=' + $('#lstEmployees').val() + "&customerid=" + $('#lstCustomers').val(), function (result) {
bindOrders(result.Data);
});
}
function bindOrders(items) {
$("#lstbody").empty();
items.forEach(function (v, i) {
$("#lstbody").append('<tr><td>' + i + '</td><td>' + v.OrderID + '</td><td>' + v.ShipName + '</td><td>' + v.ShipAddress + '</td><td>' + v.ShipCity + '</td><td>' + v.OrderDate + '</td></tr>')
});
}

对于FastHttpApi制定方法参数的在http主要有两种来源途径,一种是通过Querystring提供,而另一种则通过Post一个json内容来提供;对于组件来说只要没有添加[BodyParameter]标签的参数都由QueryString来提供(实际使用中有特别的需要则可以实现自己Parameter的属性标签来扩展)。这样一个订单查询的功能就开发完成了

WebSocket请求

由于服务端口和网站的端口是一致,所以构建websocket连接的时候并不要显式地指定地址,直接拿浏览当前的Host地址即可。

  websocket = new WebSocket("ws://" + window.location.host);
websocket.onopen = function (evt) { onOpen(evt) };
websocket.onclose = function (evt) { onClose(evt) };
websocket.onmessage = function (evt) { onMessage(evt) };
websocket.onerror = function (evt) { onError(evt) };

连接创建后就可以对服务进行请求,由于websocket默认发送的Text内容,为了能够方便调用需要制定一些数据格式规划,在这里我们首选也是Json.

    function WebSocketSearch() {
var searchInfo = {
url: '/listorders', params: { employeeid: $('#lstEmployees').val(), customerid: $('#lstCustomers').val() }
};
websocket.send(JSON.stringify(searchInfo));
}
function onMessage(evt) {
var msg = JSON.parse(evt.data);
var message;
bindOrders(msg.Data);
}

请求的数据内容主要包括urlparams,url是描述具体请求的Http地址;params则是描述对应参数名的参数。通过和ajax的查询代码来对比,两者没有多大的区别,前者是基于url请求而后者则通过描述一个json来处理。

API调用方式查看

FastHttpApi内部集成了一个API查询面页,通过这个页面可以查询当前服务下所有可访问的接口,并描述接口在ajax和websocket下的访问调用方式和相关数据格式。访问路径/_info/api.html

总结

如果你想开发一个接口服务相同时支持ajax和websocket访问的话,那FastHttpApi会是不错的选择,因为它能提供方便,高效和安全的应用服务接口编写基础服务功能。 本文例子的项目代码:/samples/HttpApiServer.HttpAndWebsocketApi

dotnet core 开发无缝兼容Http和Websocket协议的接口服务的更多相关文章

  1. dotnet core 开发体验之Routing

    开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...

  2. vs2017 js cordova + dotnet core 开发app

    原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Securit ...

  3. 性能测试培训:WebSocket协议的接口性能之Jmeter

    性能测试培训:WebSocket协议的接口性能之Jmeter poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开 ...

  4. dotNet Core开发环境搭建及简要说明

    一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...

  5. dotnet core开发体验之开始MVC

    开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...

  6. 使用ubuntu做为dotnet core开发环境

    一.安装google浏览器 1.下载安装包(传送门:http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html) 2.使用sud ...

  7. [dotnet core]使用Peach简化Socket网络通讯协议开发

    Peach是基于DotNetty的Socket网络通讯帮助类库,可以帮助开发者简化使用DotNetty,关于DotNetty可参考我之前的这篇文章. Peach内置实现了一个基于文本协议的Comman ...

  8. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...

  9. WSL2 准备dotnet core开发环境

    首先我们要知道WSL Ubuntu的版本,以便进行下一步操作: 我的是18.04,所以安装dot net SDK我们参考这里: https://docs.microsoft.com/en-us/dot ...

随机推荐

  1. datatable 笔记 服务器端查询

    var vTable = ""; $("#vip_data").dataTable({ "scrollY": 400, //竖向高度 滚动 ...

  2. 怎样在ASP.NET(C#) 使用Json序列化反序列化问题?

    using System; using System.Collections.Generic; using System.Web; using System.Web.Script.Serializat ...

  3. ssh登录远程服务器

    在终端输入ssh 用户名@IP地址, 比如输入用户名和密码,进入目录,即可查看修改文件,启动服务. 这和安装xshell和filelizza,终端有什么区别? useradd  guangbo pas ...

  4. 关于H5在微信浏览器内自动转格式,导致不能正常打开的问题

    从最近开始,微信朋友圈打开我们的H5页面有时会出现了“此网页已被QQ浏览器重新排版”的提示,直接结果就是导致H5网页或H5小游戏不能正常显示了!!这个问题什么严重,不知道腾讯又是怎么考虑的,难道真的是 ...

  5. VS2017无法发现单元测试,不能运行单元测试的解决方案

    问题: 在VS2017中新建空的单元测试后,无法运行测试,即右键菜单的"运行测试"和"调试测试" 不能运行,在测试资源管理中也无法列出这个测试. 解决方案: 1 ...

  6. conda 查看已有环境

    conda info -e # conda environments: # dlcv /Users/enzhao/suanec/libs/anaconda2/envs/dlcv py36 /Users ...

  7. Java-JSON 解析

    JSON  JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采 ...

  8. 文件上传控件bootstrap-fileinput的使用

    1.插件下载地址:https://github.com/kartik-v/bootstrap-fileinput 2.插件的引用 需要引用jquery 需要结合bootstrap使用,即页面需要引入b ...

  9. mac 下SonarQube 安装与使用

    参考文件:https://www.jianshu.com/p/aa863cf30406 https://www.jianshu.com/p/b41262fca5b8 jenkins 集成Sonar: ...

  10. Dubbo 分布式事务一致性实现

    我觉得事务的管理不应该属于Dubbo框架, Dubbo只需实现可被事务管理即可, 像JDBC和JMS都是可被事务管理的分布式资源, Dubbo只要实现相同的可被事务管理的行为,比如可以回滚, 其它事务 ...