HTTP (伺服器內部管理和其他平臺的對接)
2.1 HTTP
skynet.httpd 是一個獨立於 skynet 的,用於 http 協議解析的庫,它本身依賴 socket api 的注入。使用它,你需要把讀寫 socket 的 API 封裝好,注入到裡面就可以工作。
skynet.sockethelper 模組將 skynet 的 Socket API 封裝成 skynet.httpd 可以接受的形式:阻塞讀寫指定的位元組數、網路錯誤以異常形式丟擲。
-- examples/simpleweb.lua
local skynet = require "skynet"
local socket = require "skynet.socket"
local httpd = require "http.httpd"
local sockethelper = require "http.sockethelper"
local urllib = require "http.url"
local table = table
local string = string
local mode = ...
if mode == "agent" then
local function response(id, ...)
local ok, err = httpd.write_response(sockethelper.writefunc(id), ...)
if not ok then
-- if err == sockethelper.socket_error , that means socket closed.
skynet.error(string.format("fd = %d, %s", id, err))
end
end
skynet.start(function()
skynet.dispatch("lua", function (_,_,id)
socket.start(id) -- 開始接收一個 socket
-- limit request body size to 8192(8*1024) (you can pass nil to unlimit)
-- 一般的業務不需要處理大量上行資料,為了防止攻擊,做了一個 8K 限制。這個限制可以去掉。
local code,url,method,header,body= httpd.read_request(
sockethelper.readfunc(id), 8192)
if code then
if code ~= 200 then -- 如果協議解析有問題,就回應一個錯誤碼 code 。
response(id, code)
else
-- 這是一個示範的迴應過程,你可以根據你的實際需要,解析 url, method 和 header 做出迴應。
local tmp = {}
if header.host then
table.insert(tmp, string.format("host: %s", header.host))
end
local path, query = urllib.parse(url)
table.insert(tmp, string.format("path: %s", path))
if query then
local q = urllib.parse_query(query)
for k, v in pairs(q) do
table.insert(tmp, string.format("query: %s= %s", k,v))
end
end
response(id, code, table.concat(tmp,"\n"))
end
else
-- 如果丟擲的異常是 sockethelper.socket_error 表示是客戶端網路斷開了。
if url == sockethelper.socket_error then
skynet.error("socket closed")
else
skynet.error(url)
end
end
socket.close(id)
end)
end)
else
skynet.start(function()
local agent = {}
for i= 1, 20 do
-- 啟動 20 個代理服務用於處理 http 請求
agent[i] = skynet.newservice(SERVICE_NAME, "agent")
end
local balance = 1
-- 監聽一個 web 埠
local id = socket.listen("0.0.0.0", 8001)
socket.start(id , function(id, addr)
-- 當一個 http 請求到達的時候, 把 socket id 分發到事先準備好的代理中去處理。
skynet.error(string.format("%s connected, pass it to agent :%08x", addr, agent[balance]))
skynet.send(agent[balance], "lua", id)
balance = balance + 1
if balance > #agent then
balance = 1
end
end)
end)
end
2.2 httpc–客戶端模組
skynet 提供了一個非常簡單的 http 客戶端模組。你可以用:
httpc.request(method, host, uri, recvheader, header, content)
來提交一個 http 請求,其中
•method 是 “GET” “POST” 等。
•host 為目標機的地址
•uri 為請求的 URI
•recvheader 可以是 nil 或一張空表,用於接收回應的 http 協議頭。
•header 是自定義的 http 請求頭。
注:如果 header 中沒有給出 host ,那麼將用前面的 host 引數自動補上。
•content 為請求的內容。
它返回狀態碼和內容。如果網路出錯,則丟擲 error 。
httpc.dns(server, port)
可以用來設定一個非同步查詢 dns 的伺服器地址。如果你不給出地址,那麼將從 /etc/resolv.conf 查詢地址。如果你沒有呼叫它設定非同步 dns 查詢,那麼 skynet
將在網路底層做同步查詢。這很有可能阻塞住整個 skynet 的網路訊息處理(不僅僅阻塞單個 skynet 服務)。
另外,httpc 還提供了簡單的 httpc.get 以及 httpc.post 的封裝
如果有https的需求,可使用 lua-webclient 它是libcurl multi interface的簡單封裝,支援單執行緒,非阻塞的大量http、https請求。
httpc 可以通過設定 httpc.timeout 的值來控制超時時間。時間單位為 0.01秒。
相關文章
- nodejs平臺內建模組http伺服器NodeJSHTTP伺服器
- 國內 Linux 伺服器叢集管理的平臺Linux伺服器
- 交易平臺與託管平臺業務對接小結
- PHP HTTP 500 - 內部伺服器錯誤PHPHTTP伺服器
- 訪問 laradock 伺服器內部 http 伺服器伺服器HTTP
- 程式設計師接私活國內外平臺程式設計師
- php對接電信平臺,對接lot裝置傳送or接收資料(一)PHP
- 各種支付平臺對接系統原始碼原始碼
- 黨委組織部資訊工作管理平臺開發,幹部管理平臺建設
- 企業如何構建內部開發者平臺?
- 什麼是http500內部伺服器錯誤?HTTP伺服器
- 專案接單平臺
- 猿人學內部練習平臺1~3題
- 所謂的智慧雲端伺服器管理平臺伺服器
- 國內可以做流程管理的平臺有哪些?
- 用內網伺服器對接微信公眾號服務內網伺服器
- ASM管理的內部工具ASM
- 成品直播原始碼,實現在平臺內部的搜尋原始碼
- 猿人學內部練習平臺第54~60題
- Tungsten Fabric實戰:對接vMX虛擬路由平臺填坑路由
- http頭部如何對快取的控制HTTP快取
- Java內部類和匿名內部類的用法Java
- Netweaver和SAP雲平臺的quota管理
- 組織部幹部管理平臺開發,智慧組工人事決策平臺建設方案
- 程式設計師接私活平臺程式設計師
- 國內典型資料交易平臺對比分析
- 多伺服器運維管理 集中監控與管理平臺伺服器運維
- 什麼是HTTP500內部伺服器錯誤,要如何修復?HTTP伺服器
- 企管部門的制度平臺紮實後再容納內控制度
- 組織部幹部管理系統開發,幹部任免平臺搭建解決方案
- BBC如何使用團隊拓撲構建內部核心平臺?
- Java對接拼多多開放平臺API(加密上雲等全流程)JavaAPI加密
- 最近在對接電商供應鏈,說說開放平臺API介面API
- 中移鏈控制檯對接4A平臺功能驗證介紹
- Docker的web端管理平臺對比(DockerUI 、Shipyard、Portainer、Daocloud)DockerWebUIAICloud
- 從內部自用到對外服務,配置管理的演進和設計優化實踐優化
- 伺服器內部錯誤500的原因伺服器
- 內部開發者平臺與門戶:二者有何關聯?