• 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 == 0 || 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

  • 相关阅读:
    谈谈Oracle基本操作(下)
    谈谈Oracle基本操作(上)
    java理论之java多线程与网络编程
    java理论之java--GUI(图形用户管理)与 IO/流
    java理论之java数组和集合
    存图片的
    .html()渲染后的内容还是带标签的字符串的问题
    Vuejs报错error: Unexpected console statement (no-console) at src... 解决办法
    常用正则表达式
    移动WEB---01.关于屏幕像素
  • 原文地址:https://www.cnblogs.com/smark/p/9712639.html
Copyright © 2020-2023  润新知