87 lines
2.5 KiB
Go
87 lines
2.5 KiB
Go
package discover
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
gohttp "apigo.cc/go/http"
|
|
"apigo.cc/go/jsmod"
|
|
)
|
|
|
|
func init() {
|
|
jsmod.Register("discover", map[string]any{
|
|
// RPC 调用 (全大写对齐 HTTP)
|
|
"GET": func(app, path string, headers map[string]string) *jsResult {
|
|
return wrapResult(Get(app, path, flattenHeaders(headers)...))
|
|
},
|
|
"POST": func(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(Post(app, path, data, flattenHeaders(headers)...))
|
|
},
|
|
"PUT": func(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(DefaultDiscoverer.Put(app, path, data, flattenHeaders(headers)...))
|
|
},
|
|
"DELETE": func(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(DefaultDiscoverer.Delete(app, path, data, flattenHeaders(headers)...))
|
|
},
|
|
|
|
// 链路透传
|
|
"From": func(r *http.Request) *jsCaller {
|
|
return &jsCaller{c: DefaultDiscoverer.From(r)}
|
|
},
|
|
})
|
|
}
|
|
|
|
func flattenHeaders(m map[string]string) []string {
|
|
if len(m) == 0 {
|
|
return nil
|
|
}
|
|
res := make([]string, 0, len(m)*2)
|
|
for k, v := range m {
|
|
res = append(res, k, v)
|
|
}
|
|
return res
|
|
}
|
|
|
|
// jsResult 包装 *gohttp.Result 以对齐 PascalCase
|
|
type jsResult struct {
|
|
r *gohttp.Result
|
|
}
|
|
|
|
func wrapResult(r *gohttp.Result) *jsResult {
|
|
return &jsResult{r: r}
|
|
}
|
|
|
|
func (jr *jsResult) String() string { return jr.r.String() }
|
|
func (jr *jsResult) Bytes() []byte { return jr.r.Bytes() }
|
|
func (jr *jsResult) Map() map[string]any { return jr.r.Map() }
|
|
func (jr *jsResult) Slice() []any { return jr.r.Slice() }
|
|
func (jr *jsResult) Status() int {
|
|
if jr.r.Response != nil {
|
|
return jr.r.Response.StatusCode
|
|
}
|
|
return 0
|
|
}
|
|
func (jr *jsResult) Error() string {
|
|
if jr.r.Error != nil {
|
|
return jr.r.Error.Error()
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// jsCaller 包装 *Caller 以对齐全大写方法
|
|
type jsCaller struct {
|
|
c *Caller
|
|
}
|
|
|
|
func (jc *jsCaller) GET(app, path string, headers map[string]string) *jsResult {
|
|
return wrapResult(jc.c.Get(app, path, flattenHeaders(headers)...))
|
|
}
|
|
func (jc *jsCaller) POST(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(jc.c.Post(app, path, data, flattenHeaders(headers)...))
|
|
}
|
|
func (jc *jsCaller) PUT(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(jc.c.Put(app, path, data, flattenHeaders(headers)...))
|
|
}
|
|
func (jc *jsCaller) DELETE(app, path string, data any, headers map[string]string) *jsResult {
|
|
return wrapResult(jc.c.Delete(app, path, data, flattenHeaders(headers)...))
|
|
}
|