Các__Serve
chức năng được sử dụng để tạo dịch vụ HTTP, dịch vụ TCP và dịch vụ Websocket (dựa trên giao thức HTTP).
Trả về một chuỗi ghi lại địa chỉ IP và cổng của dịch vụ được tạo. Ví dụ:127.0.0.1:8088
, [::]:8089
.
chuỗi
__Serve ((serveURI, xử lý) __Serve ((serveURI, xử lý,...args)
CácserveURI
tham số được sử dụng để cấu hình giao thức, địa chỉ IP, cổng và các thiết lập khác của việc ràng buộc dịch vụ, chẳng hạn nhưhttp://0.0.0.0:8088?gzip=true
, nghĩa là,http://:8088?gzip=true
.
serveURI
thiết lập tham số, chẳng hạn nhưtcp://127.0.0.1:6666?tls=true
; bạn có thể thêm chứng chỉ và khóa riêng, chẳng hạn nhưtls=true&cert_pem=xxxx&cert_key_pem=xxxx
.serveURI
cài đặt tham số, chẳng hạn nhưhttp://127.0.0.1:6666?gzip=true
; bạn có thể thiết lập cài đặt nén:gzip=true
.
CácserveURI
tham số được sử dụng cho HTTP, chẳng hạn nhưhttps://127.0.0.1:6666?tls=true&gzip=true
; bạn có thể thêmcert_pem
vàcert_key_pem
các tham số để tải giấy chứng nhận.serveURI
đúng
chuỗi
Cáchandler
tham số được sử dụng để truyền trong chức năng xử lý định tuyến (protocol HTTP), chức năng xử lý tin nhắn (protocol TCP), và chức năng xử lý luồng (Websocket).
Chức năng gọi lại được chuyển vào bởi tham sốhandler
có thể xác định nhiều tham số, tham số đầu tiên là đối tượng ctx ( đối tượng ngữ cảnh).
người xử lý
đúng
chức năng
Các tham số thực tế của hàm gọi lại được truyền như các tham sốhandler
Có thể có nhiều thông sốarg
Ví dụ:
__Serve("http://:8088", function(ctx, a, b, c) {
Log(`ctx.host():`, ctx.host(), ", a=", a, ", b=", b, ", c=", c)
}, 1, 2, 3)
Các thông số1
, 2
, 3
qua khi gọi cho__Serve()
chức năng tương ứng với các thông sốa
, b
, c
được thông qua trong chức năng gọi lại.
arg sai chuỗi, số, bool, đối tượng, mảng, hàm, giá trị null và các loại khác được hỗ trợ bởi hệ thống
function main() {
let httpServer = __Serve("http://:8088?gzip=true", function (ctx) {
Log("http connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
let path = ctx.path()
if (path == "/") {
ctx.write(JSON.stringify({
path: ctx.path(),
method: ctx.method(),
headers: ctx.headers(),
cookie: ctx.header("Cookie"),
remote: ctx.remoteAddr(),
query: ctx.rawQuery()
}))
} else if (path == "/tickers") {
let ret = exchange.GetTickers()
if (!ret) {
ctx.setStatus(500)
ctx.write(GetLastError())
} else {
ctx.write(JSON.stringify(ret))
}
} else if (path == "/wss") {
if (ctx.upgrade("websocket")) { // upgrade to websocket
while (true) {
let r = ctx.read(10)
if (r == "") {
break
} else if (r) {
if (r == "ticker") {
ctx.write(JSON.stringify(exchange.GetTicker()))
} else {
ctx.write("not support")
}
}
}
Log("websocket closed", ctx.remoteAddr())
}
} else {
ctx.setStatus(404)
}
})
let echoServer = __Serve("tcp://:8089", function (ctx) {
Log("tcp connect from: ", ctx.remoteAddr(), "->", ctx.localAddr())
while (true) {
let d = ctx.read()
if (!d) {
break
}
ctx.write(d)
}
Log("connect closed")
})
Log("http serve on", httpServer, "tcp serve on", echoServer)
for (var i = 0; i < 5; i++) {
if (i == 2) {
// test Http
var retHttp = HttpQuery("http://127.0.0.1:8088?num=123&limit=100", {"debug": true})
Log("retHttp:", retHttp)
} else if (i == 3) {
// test TCP
var tcpConn = Dial("tcp://127.0.0.1:8089")
tcpConn.write("Hello TCP Server")
var retTCP = tcpConn.read()
Log("retTCP:", retTCP)
} else if (i == 4) {
// test Websocket
var wsConn = Dial("ws://127.0.0.1:8088/wss|compress=gzip")
wsConn.write("ticker")
var retWS = wsConn.read(1000)
Log("retWS:", retWS)
// no depth
wsConn.write("depth")
retWS = wsConn.read(1000)
Log("retWS:", retWS)
}
Sleep(1000)
}
}
# Unsupported
// Unsupported
Websocket
Dịch vụ được thực hiện dựa trên giao thức HTTP. Bạn có thể thiết lập một nhánh định tuyến trong đường dẫn và thiết kế mã thực hiện choWebsocket
Bạn có thể tham khảo mẫu mã trong phần này.Chức năng gọi lại được truyền vào bởi tham sốhandler
nhận được mộtctx
các tham số.ctx
tham số là một đối tượng ngữ cảnh được sử dụng để lấy và ghi dữ liệu, với các phương pháp sau:
HTTP/1.1
, tcp
.http://127.0.0.1:8088?num=123
, và chức năng xử lý gọi lại được truyền vào bởi các thông sốhandler
trả lại"123"
khi nàoctx.query("num")
được gọi là.User-Agent
trong tiêu đề của yêu cầu hiện tại:ctx.header("User-Agent")
.GET
, POST
, vvctx
đối tượng ngữ cảnh đến giao thức Websocket; trả về giá trị Boolean (true) nếu chuyển đổi thành công, và giá trị Boolean (false) nếu nó thất bại.read
Phương pháp này không được hỗ trợ trong giao thức HTTP thông thường. Bạn có thể chỉ định tham số timeouttimeout_ms
trong vài mili giây.JSON.stringify()
để mã hóa đối tượng JSON vào một chuỗi và sau đó viết nó.WebSocket
giao thức, bạn có thể sử dụng phương pháp này để truyền chuỗi mã hóa cho khách hàng.{@fun/Global/HttpQuery HttpQuery}, {@fun/Global/HttpQuery_Go HttpQuery_Go}
EventLoop _G