Tài nguyên đang được tải lên... tải...

__Hãy phục vụ

Các__Servechứ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ácserveURItham 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.

  • Giao thức TCPserveURIthiế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.
  • Giao thức HTTPserveURIcà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ácserveURItham 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_pemcert_key_pemcác tham số để tải giấy chứng nhận.

serveURI đúng chuỗi Cáchandlertham 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ốhandlercó 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ốhandlerCó thể có nhiều thông sốargVí 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, 3qua 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
  • Chức năng này chỉ hỗ trợ các chiến lược ngôn ngữ JavaScript.
  • Các chủ đề dịch vụ được cô lập khỏi phạm vi toàn cầu, vì vậy nó không hỗ trợ đóng hoặc tham chiếu đến các biến bên ngoài, các hàm tùy chỉnh, v.v.; tuy nhiên, nó có thể gọi tất cả các hàm API nền tảng.
  • CácWebsocketDị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 choWebsocketBạ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ốhandlernhận được mộtctxcác tham số.ctxtham 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:

  • ctx.proto ((() Được áp dụng cho giao thức Http/TCP, trả về tên giao thức khi được gọi. Ví dụ:HTTP/1.1, tcp.
  • ctx.host() Được áp dụng cho giao thức HTTP, nó trả về thông tin máy chủ khi gọi địa chỉ IP và cổng.
  • ctx.path ((() Được áp dụng cho giao thức HTTP, trả về đường dẫn yêu cầu khi được gọi.
  • ctx.query ((key)) Được áp dụng cho giao thức HTTP, trả về giá trị tương ứng với khóa trong truy vấn trong yêu cầu khi được gọi. Ví dụ, yêu cầu được gửi là: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ốhandlertrả lại"123"khi nàoctx.query("num")được gọi là.
  • ctx.rawQuery() Được áp dụng cho giao thức Http, khi được gọi, trả về truy vấn ban đầu trong yêu cầu (quy vấn của yêu cầu Http).
  • ctx.headers ((() Áp dụng cho giao thức HTTP, và trả về thông tin tiêu đề yêu cầu trong yêu cầu khi được gọi.
  • ctx.header ((key)) Áp dụng giao thức HTTP, nó trả về giá trị của một khóa trong tiêu đề yêu cầu được chỉ định khi được gọi.User-Agenttrong tiêu đề của yêu cầu hiện tại:ctx.header("User-Agent").
  • ctx.method (() Áp dụng cho giao thức HTTP, trả về phương thức yêu cầu khi được gọi, chẳng hạn nhưGET, POST, vv
  • ctx.body ((() Áp dụng để yêu cầu POST của giao thức HTTP, và trả về cơ thể của yêu cầu khi được gọi.
  • ctx.setHeader ((key, value) Áp dụng giao thức HTTP để thiết lập thông tin tiêu đề yêu cầu của tin nhắn phản hồi.
  • ctx.setStatus (định mã) Được áp dụng cho giao thức Http, đặt mã trạng thái tin nhắn Http. Thông thường, mã trạng thái Http được đặt ở cuối nhánh định tuyến. Giá trị mặc định là 200.
  • ctx.remoteAddr ((() Được áp dụng cho giao thức Http / TCP, trả về địa chỉ khách hàng từ xa và cổng trong yêu cầu khi được gọi.
  • ctx.localAddr() Được áp dụng cho giao thức Http / TCP, trả về địa chỉ địa phương và cổng của dịch vụ khi được gọi.
  • ctx.upgrade ((websocket) Áp dụng để thực hiện giao thức Websocket dựa trên giao thức HTTP, chuyển đổictxđố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.
  • ctx.read ((timeout_ms) Áp dụng để thực hiện giao thức Websocket / giao thức TCP dựa trên giao thức HTTP, đọc dữ liệu của kết nối Websocket và kết nối TCP.readPhươ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_mstrong vài mili giây.
  • ctx.write ((s) Được áp dụng cho giao thức HTTP/TCP, được sử dụng để viết dữ liệu chuỗi.JSON.stringify()để mã hóa đối tượng JSON vào một chuỗi và sau đó viết nó.WebSocketgiao 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