dotnet core 开发无缝兼容Http和Websocket协议的接口服务
在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于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请求:
/GetEmployeesName获取雇员的ID和名称列表/GetCustomersName获取客户的ID和名称列表/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);
}
请求的数据内容主要包括url和params,url是描述具体请求的Http地址;params则是描述对应参数名的参数。通过和ajax的查询代码来对比,两者没有多大的区别,前者是基于url请求而后者则通过描述一个json来处理。
API调用方式查看
FastHttpApi内部集成了一个API查询面页,通过这个页面可以查询当前服务下所有可访问的接口,并描述接口在ajax和websocket下的访问调用方式和相关数据格式。访问路径/_info/api.html
总结
如果你想开发一个接口服务相同时支持ajax和websocket访问的话,那FastHttpApi会是不错的选择,因为它能提供方便,高效和安全的应用服务接口编写基础服务功能。 本文例子的项目代码:/samples/HttpApiServer.HttpAndWebsocketApi
dotnet core 开发无缝兼容Http和Websocket协议的接口服务的更多相关文章
- dotnet core 开发体验之Routing
开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...
- vs2017 js cordova + dotnet core 开发app
原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Securit ...
- 性能测试培训:WebSocket协议的接口性能之Jmeter
性能测试培训:WebSocket协议的接口性能之Jmeter poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试开 ...
- dotNet Core开发环境搭建及简要说明
一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...
- dotnet core开发体验之开始MVC
开始 在上一篇文章:dotnet core多平台开发体验 ,体验了一把dotnet core 之后,现在想对之前做的例子进行改造,想看看加上mvc框架是一种什么样的体验,于是我就要开始诞生今天的这篇文 ...
- 使用ubuntu做为dotnet core开发环境
一.安装google浏览器 1.下载安装包(传送门:http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html) 2.使用sud ...
- [dotnet core]使用Peach简化Socket网络通讯协议开发
Peach是基于DotNetty的Socket网络通讯帮助类库,可以帮助开发者简化使用DotNetty,关于DotNetty可参考我之前的这篇文章. Peach内置实现了一个基于文本协议的Comman ...
- dotnet core 开发中遇到的问题
1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...
- WSL2 准备dotnet core开发环境
首先我们要知道WSL Ubuntu的版本,以便进行下一步操作: 我的是18.04,所以安装dot net SDK我们参考这里: https://docs.microsoft.com/en-us/dot ...
随机推荐
- Wish-递推DP记数
链接:https://nanti.jisuanke.com/t/35618 题意: 如果一个数大于等于 1010 且任意连续两位都是质数,那么就称之为 Wish 数.当然,第一个 Wish 数是 11 ...
- Core Location实现定位
2013/4/22记录: 注意:如非必要,不应该多次轮询位置信息i 使用时,可根据需要制定精度,通过仔细制定所需的绝对最低精度级别,可以纺织不必要的电池消耗. 导入:CoreLocation.f ...
- 修改 bug 总结
对于 elementui table 组件的排序 要求对每列数据进行排序 数据是 金额之类 数字的没问题 但是 针对 标题中有数字,字母,文字的时候 会排序错误 :sort-method=" ...
- Java Concurrency in Practice——读书笔记
Thread Safety线程安全 线程安全编码的核心,就是管理对状态(state)的访问,尤其是对(共享shared.可变mutable)状态的访问. shared:指可以被多个线程访问的变量 mu ...
- 在Github上为项目添加多个用户
点击项目目录中的Settings 点击Collaborators 添加后,合作者会受到确认邮件,等待合作者确认后,合作者就可以提交了 添加组织 在Settings中找到Organizations 点击 ...
- 关于阿里云Centos7 Mailx发送邮件失败的处理
开始通过配置系统自带的mail 发送邮件 在其中一台服务器怎么都不行 /etc/mail.rc配置: set from="邮箱名" set smtp="smtp.163. ...
- Nginx服务器 配置 https
参考 这里 1. 购买证书 2. 补全信息 3. 下载证书( .pem + .key ) 4. 上传至服务器 /usr/local/nginx/conf/cert 下 5. 修改 nginx.con ...
- 用递归方法求n的阶乘
代码: #include<iostream> using namespace std; int fact(int n); int main() { int n; loop: cin > ...
- C# INI文件读写类
public class Ini { // 声明INI文件的写操作函数 WritePrivateProfileString() [System.Runtime.InteropServices.DllI ...
- DCOS实践分享(2):基于Docker Compose和Swarm的Docker化之路
2016 年1 月 23 日,北京史上气温最低的一天. 在下午 1 点半的时候,由 DaoCloud 赞助的 2016 年度首次 Docker Meetup 准时开始. 在这次Meetup中,我分享了 ...