在應用接口開發中往往要針對不同協義開發相應的代理服務,但對於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請求:
/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