Compare commits
No commits in common. "a7f0693809a490d723a1dc867d70c63033c0ec56" and "8a2f76ffc96db0f609e56c37d1f1c23436ab753d" have entirely different histories.
a7f0693809
...
8a2f76ffc9
30
go.mod
30
go.mod
@ -3,26 +3,26 @@ module apigo.cc/go/service
|
|||||||
go 1.25.0
|
go 1.25.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
apigo.cc/go/cast v1.3.3
|
apigo.cc/go/cast v1.3.0
|
||||||
apigo.cc/go/config v1.3.1
|
apigo.cc/go/discover v1.3.0
|
||||||
apigo.cc/go/discover v1.3.2
|
apigo.cc/go/file v1.3.0
|
||||||
apigo.cc/go/file v1.3.2
|
apigo.cc/go/http v1.3.0
|
||||||
apigo.cc/go/http v1.3.2
|
apigo.cc/go/id v1.3.0
|
||||||
apigo.cc/go/id v1.3.1
|
apigo.cc/go/log v1.3.0
|
||||||
apigo.cc/go/log v1.3.4
|
apigo.cc/go/redis v1.3.0
|
||||||
apigo.cc/go/redis v1.3.2
|
apigo.cc/go/safe v1.3.0
|
||||||
apigo.cc/go/safe v1.3.1
|
apigo.cc/go/starter v1.0.1
|
||||||
apigo.cc/go/starter v1.0.5
|
apigo.cc/go/timer v1.3.0
|
||||||
apigo.cc/go/timer v1.3.1
|
|
||||||
github.com/gorilla/websocket v1.5.3
|
github.com/gorilla/websocket v1.5.3
|
||||||
golang.org/x/net v0.54.0
|
golang.org/x/net v0.54.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
apigo.cc/go/crypto v1.3.1 // indirect
|
apigo.cc/go/config v1.3.0 // indirect
|
||||||
apigo.cc/go/encoding v1.3.1 // indirect
|
apigo.cc/go/crypto v1.3.0 // indirect
|
||||||
apigo.cc/go/rand v1.3.1 // indirect
|
apigo.cc/go/encoding v1.3.0 // indirect
|
||||||
apigo.cc/go/shell v1.3.1 // indirect
|
apigo.cc/go/rand v1.3.0 // indirect
|
||||||
|
apigo.cc/go/shell v1.3.0 // indirect
|
||||||
github.com/gomodule/redigo v2.0.0+incompatible // indirect
|
github.com/gomodule/redigo v2.0.0+incompatible // indirect
|
||||||
golang.org/x/crypto v0.51.0 // indirect
|
golang.org/x/crypto v0.51.0 // indirect
|
||||||
golang.org/x/sys v0.44.0 // indirect
|
golang.org/x/sys v0.44.0 // indirect
|
||||||
|
|||||||
60
go.sum
60
go.sum
@ -1,33 +1,33 @@
|
|||||||
apigo.cc/go/cast v1.3.3 h1:aln5eDR5DZVWVzZ/y5SJh1gQNgWv2sT82I25NaO9g34=
|
apigo.cc/go/cast v1.3.0 h1:ZTcLYijkqZjSWSCSpJUWMfzJYeJKbwKxquKkPrFsROQ=
|
||||||
apigo.cc/go/cast v1.3.3/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
|
apigo.cc/go/cast v1.3.0/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk=
|
||||||
apigo.cc/go/config v1.3.1 h1:wZzUh4oL+fGD6SayVgX6prLPMsniM25etWFcEH8XzIE=
|
apigo.cc/go/config v1.3.0 h1:TwI3bv3D+BJrAnFx+o62HQo3FarY2Ge3SCGsKchFYGg=
|
||||||
apigo.cc/go/config v1.3.1/go.mod h1:7KHz/1WmtBLM762Lln/TaXh2dmlMvJTLhnlk33zbS3U=
|
apigo.cc/go/config v1.3.0/go.mod h1:88lqKEBXlIExFKt1geLONVLYyM+QhRVpBe0ok3OEvjI=
|
||||||
apigo.cc/go/crypto v1.3.1 h1:ulQ2zX9bUWirk0sEacx1Srsjs2Jow7HlZq7ED7msNcg=
|
apigo.cc/go/crypto v1.3.0 h1:rGRrrb5O+4M50X5hVUmJQbXx3l87zzlcgzGtUvZrZL8=
|
||||||
apigo.cc/go/crypto v1.3.1/go.mod h1:SwHlBFDPddttWgFFtzsEMla8CM/rcFy9nvdsJjW4CIs=
|
apigo.cc/go/crypto v1.3.0/go.mod h1:uSCcmbcFoiltUPMQTSuqmU9nfKEH/lRs7nQ7aa3Z4Mc=
|
||||||
apigo.cc/go/discover v1.3.2 h1:hzo5PQSAbJrF9Qk7yCMoXWatHGe7lR2MNUqLLQ5oUSk=
|
apigo.cc/go/discover v1.3.0 h1:CXuKtAZygU+4TMHtebVkjWyyWmPgoLbsJFdKFGiCOd8=
|
||||||
apigo.cc/go/discover v1.3.2/go.mod h1:77kZLGovdCYAMspkmL6iif65Yzhyg143ffQseZx+j40=
|
apigo.cc/go/discover v1.3.0/go.mod h1:VMu1qC6AngVFQMdaCwGoq3/PPX0xDnjkG+1AcSA+Zvs=
|
||||||
apigo.cc/go/encoding v1.3.1 h1:y8O58KYAyulkThg1O2ji2BqjnFoSvk42sit9I3z+K7Y=
|
apigo.cc/go/encoding v1.3.0 h1:8jqNHoZBR8vOU/BGsLFebfp1Txa1UxDRpd7YwzIFLJs=
|
||||||
apigo.cc/go/encoding v1.3.1/go.mod h1:xAJk5b83VZ31mXMTnyp0dfMoBKfT/AHDn0u+cQfojgY=
|
apigo.cc/go/encoding v1.3.0/go.mod h1:kT/uUJiuAOkZ4LzUWrUtk/I0iL1D8aatvD+59bDnHBo=
|
||||||
apigo.cc/go/file v1.3.2 h1:pu4oiDyiqgj3/eykfnJf+/6+A9v/Z0b3ClP5XK+lwG4=
|
apigo.cc/go/file v1.3.0 h1:xG9FcY3Rv6Br83r9pq9QsIXFrplx4g8ITOkHSzfzXRg=
|
||||||
apigo.cc/go/file v1.3.2/go.mod h1:vci4h0Pz94mV6dkniQkuyBYERVYeq7/LX4jJVuCg9hs=
|
apigo.cc/go/file v1.3.0/go.mod h1:pYHBlB/XwsrnWpEh7GIFpbiqobrExfiB+rEN8V2d2kY=
|
||||||
apigo.cc/go/http v1.3.2 h1:0Or5KfoIq4+yeWKYusYPV8XLPw8XuzJMeaFv7dZViLI=
|
apigo.cc/go/http v1.3.0 h1:1ZweotOuAxTI8wfib9knWYXM2t0POOJ3ezgOKObH3sg=
|
||||||
apigo.cc/go/http v1.3.2/go.mod h1:Q9R7Ors0Fz2A6Mxg0dykO2PjCzdAHRRXreOUMjMOLwA=
|
apigo.cc/go/http v1.3.0/go.mod h1:DC3phxBNbt/dOWdhxtffAEYeUs3j6P3BD8e6J8gxU9U=
|
||||||
apigo.cc/go/id v1.3.1 h1:pkqi6VeWyQoHuIu0Zbx/RRxIAdM61Js0j6cY1M9XVCk=
|
apigo.cc/go/id v1.3.0 h1:Tr2Yj0Rl19lfwW5wBTJ407o/zgo2oVRLE20WWEgJzdE=
|
||||||
apigo.cc/go/id v1.3.1/go.mod h1:P2/vl3tyW3US+ayOFSMoPIOCulNLBngNYPhXJC/Z7J4=
|
apigo.cc/go/id v1.3.0/go.mod h1:AFH3kMFwENfXNyijnAFWEhSF1o3y++UBPem1IUlrcxA=
|
||||||
apigo.cc/go/log v1.3.4 h1:UT8Neb9r4QjjbCFbTzw+ZeTxd+DmdmR5gNExeR4Cj+g=
|
apigo.cc/go/log v1.3.0 h1:61Z80WGN6SnhgxgoR8xuVYIieMdjlJKmf8JX1HXzp0Y=
|
||||||
apigo.cc/go/log v1.3.4/go.mod h1:/Q/2r51xWSsrS4QN5U9jLiTw8n6qNC8kG9nuVHweY20=
|
apigo.cc/go/log v1.3.0/go.mod h1:dz4bSz9BnOgutkUJJZfX3uDDwsMpUxt7WF50mLK9hgE=
|
||||||
apigo.cc/go/rand v1.3.1 h1:7FvsI6PtQ5XrWER0dTiLVo0p7GIxRidT/TBKhVy93j8=
|
apigo.cc/go/rand v1.3.0 h1:k+UFAhMySwXf+dq8Om9TniZV6fm6gAE0evbrqMEdwQU=
|
||||||
apigo.cc/go/rand v1.3.1/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
|
apigo.cc/go/rand v1.3.0/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk=
|
||||||
apigo.cc/go/redis v1.3.2 h1:iUWL/CHHnfonz0dJq6/V4IG3QuXBoHA2L1xnoGEbNEQ=
|
apigo.cc/go/redis v1.3.0 h1:3NJE3xPXzhCwL+Mh1iyphFrsKWEuPlY26LHJfMVFSeU=
|
||||||
apigo.cc/go/redis v1.3.2/go.mod h1:/k5wcfAzB9jrfd9otabio9CPUxEsLPgEs4oggBG5sbs=
|
apigo.cc/go/redis v1.3.0/go.mod h1:KPDPwMOER7WJX3Qev24LTeAOSmCl8OApe8iagPDxOUQ=
|
||||||
apigo.cc/go/safe v1.3.1 h1:irTCqPAC97gGsX/Lw5AzLelDt1xXLEZIAaVhLELWe9Q=
|
apigo.cc/go/safe v1.3.0 h1:uctdAUsphT9p60Tk4oS5xPCe0NoIdOHfsYv4PNS0Rok=
|
||||||
apigo.cc/go/safe v1.3.1/go.mod h1:XdOpBhN2vkImalaykYXXmEpczqWa1y3ah6/Q72cdRqE=
|
apigo.cc/go/safe v1.3.0/go.mod h1:tC9X14V+qh0BqIrVg4UkXbl+2pEN+lj2ZNI8IjDB6Fs=
|
||||||
apigo.cc/go/shell v1.3.1 h1:M8oD0b2HcJuCC6frQFx11b3UTcTx3lATX8XK+YXSVm8=
|
apigo.cc/go/shell v1.3.0 h1:hdxuYPN/7T2BuM/Ja8AjVUhbRqU/wpi8OjcJVziJ0nw=
|
||||||
apigo.cc/go/shell v1.3.1/go.mod h1:ZMdJjpCpWdvsHKUXlelh/AxsV/nWdkH/k3lISfzMdUw=
|
apigo.cc/go/shell v1.3.0/go.mod h1:aNJiRWibxlA485yX3t+07IVAbrALKmxzv4oGEUC+hK4=
|
||||||
apigo.cc/go/starter v1.0.5 h1:pgjBun7zc3J+3hcWnP22bGtgB3+TiNXOrOGVyGM7u1Q=
|
apigo.cc/go/starter v1.0.1 h1:7Qv/rRlEVlTX7wjr1LpV1XX1wUD4UAssDi6J+YCh73s=
|
||||||
apigo.cc/go/starter v1.0.5/go.mod h1:auAvnBknZuMMps6HRtlwf8Z5gCHRQYsVw7WhhiGwWpg=
|
apigo.cc/go/starter v1.0.1/go.mod h1:xHfo+36hXGdVhhnRqd1l+Vk6Fp1ecN2LDAcsDOVodXk=
|
||||||
apigo.cc/go/timer v1.3.1 h1:YMSusF1LfJYOf6tAW94Yipj3pHrX6QhfP7Rk3nGFT8k=
|
apigo.cc/go/timer v1.3.0 h1:dorVGKw0xR6Gj8Pwfl86K46szMBfD31XyO+uUqxU+EI=
|
||||||
apigo.cc/go/timer v1.3.1/go.mod h1:kOnqTTX+zA4AH7SfC+LpUm4ZvS+DVyWWMqul/V5QWJs=
|
apigo.cc/go/timer v1.3.0/go.mod h1:kOnqTTX+zA4AH7SfC+LpUm4ZvS+DVyWWMqul/V5QWJs=
|
||||||
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
|
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
|
||||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
|
|||||||
59
service.go
59
service.go
@ -151,26 +151,6 @@ func Host(host string) *HostContext {
|
|||||||
return &HostContext{host: host}
|
return &HostContext{host: host}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register 注册一个 Web 服务 (使用默认 Host "*")
|
|
||||||
func Register(method, path string, serviceFunc any) *webServiceType {
|
|
||||||
return Host("*").Register(method, path, serviceFunc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterWebsocket 注册一个 WebSocket 服务 (使用默认 Host "*")
|
|
||||||
func RegisterWebsocket(path string, serviceFunc any) *websocketServiceType {
|
|
||||||
return Host("*").WebSocket(path, serviceFunc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proxy 注册一个代理转发 (使用默认 Host "*")
|
|
||||||
func Proxy(authLevel int, path string, to string) {
|
|
||||||
Host("*").Proxy(authLevel, path, to)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restful 注册一个符合 RESTful 规范的服务结构体 (使用默认 Host "*")
|
|
||||||
func Restful(authLevel int, path string, serviceStruct any) {
|
|
||||||
Host("*").Restful(authLevel, path, serviceStruct)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (hc *HostContext) Register(method, path string, serviceFunc any) *webServiceType {
|
func (hc *HostContext) Register(method, path string, serviceFunc any) *webServiceType {
|
||||||
s, err := makeCachedService(serviceFunc)
|
s, err := makeCachedService(serviceFunc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -311,45 +291,6 @@ func (hc *HostContext) WebSocket(path string, serviceFunc any) *websocketService
|
|||||||
return ws
|
return ws
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restful 自动根据方法名注册 RESTful 服务
|
|
||||||
func (hc *HostContext) Restful(authLevel int, path string, serviceStruct any) {
|
|
||||||
v := reflect.ValueOf(serviceStruct)
|
|
||||||
t := v.Type()
|
|
||||||
if t.Kind() == reflect.Ptr {
|
|
||||||
t = t.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := 0; i < v.NumMethod(); i++ {
|
|
||||||
methodName := v.Type().Method(i).Name
|
|
||||||
var httpMethod string
|
|
||||||
switch {
|
|
||||||
case strings.HasPrefix(methodName, "Get"):
|
|
||||||
httpMethod = "GET"
|
|
||||||
case strings.HasPrefix(methodName, "Post"):
|
|
||||||
httpMethod = "POST"
|
|
||||||
case strings.HasPrefix(methodName, "Put"):
|
|
||||||
httpMethod = "PUT"
|
|
||||||
case strings.HasPrefix(methodName, "Delete"):
|
|
||||||
httpMethod = "DELETE"
|
|
||||||
case strings.HasPrefix(methodName, "Patch"):
|
|
||||||
httpMethod = "PATCH"
|
|
||||||
default:
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
subPath := strings.ToLower(methodName[len(httpMethod):])
|
|
||||||
if subPath == "" {
|
|
||||||
hc.Register(httpMethod, path, v.Method(i).Interface()).Auth(authLevel)
|
|
||||||
} else {
|
|
||||||
fullPath := path
|
|
||||||
if !strings.HasSuffix(fullPath, "/") {
|
|
||||||
fullPath += "/"
|
|
||||||
}
|
|
||||||
hc.Register(httpMethod, fullPath+subPath, v.Method(i).Interface()).Auth(authLevel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// webServiceType 链式配置方法
|
// webServiceType 链式配置方法
|
||||||
func (s *webServiceType) Auth(level int) *webServiceType {
|
func (s *webServiceType) Auth(level int) *webServiceType {
|
||||||
s.authLevel = level
|
s.authLevel = level
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user