discover/js_export.go

80 lines
2.1 KiB
Go
Raw Normal View History

package discover
import (
"net/http"
gohttp "apigo.cc/go/http"
"apigo.cc/go/jsmod"
)
func init() {
jsmod.Register("discover", map[string]any{
// RPC 调用 (消费默认实例)
"get": func(app, path string, headers ...string) *jsResult {
return wrapResult(Get(app, path, headers...))
},
"post": func(app, path string, data any, headers ...string) *jsResult {
return wrapResult(Post(app, path, data, headers...))
},
"put": func(app, path string, data any, headers ...string) *jsResult {
return wrapResult(DefaultDiscoverer.Put(app, path, data, headers...))
},
"delete": func(app, path string, data any, headers ...string) *jsResult {
return wrapResult(DefaultDiscoverer.Delete(app, path, data, headers...))
},
// 链路透传
"from": func(r *http.Request) *jsCaller {
return &jsCaller{c: DefaultDiscoverer.From(r)}
},
})
}
// jsResult 包装 *gohttp.Result 以隐藏 Save() 等危险方法
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 ...string) *jsResult {
return wrapResult(jc.c.Get(app, path, headers...))
}
func (jc *jsCaller) Post(app, path string, data any, headers ...string) *jsResult {
return wrapResult(jc.c.Post(app, path, data, headers...))
}
func (jc *jsCaller) Put(app, path string, data any, headers ...string) *jsResult {
return wrapResult(jc.c.Put(app, path, data, headers...))
}
func (jc *jsCaller) Delete(app, path string, data any, headers ...string) *jsResult {
return wrapResult(jc.c.Delete(app, path, data, headers...))
}