Как написать интерфейс для сложного http-клиента, такого как gorequest, с методами, которые возвращают себя для цепочки
Я пишу пакет, который должен передать экземпляр *gorequest.SuperAgent
методу в подпакете
// main.go
func main() {
req := gorequest.New()
result := subpackage.Method(req)
fmt.Println(result)
}
// subpackage.go
func Method(req *gorequest.SuperAgent) string {
req.Get("http://www.foo.com").Set("bar", "baz")
_, body, _ := req.End()
return body
}
Я продолжаю ходить по кругу, пытаясь написать интерфейс для суперагента Gorequest, чтобы я мог правильно изолировать и протестировать свои методы подпакета с заглушкой gorequest
,
type Getter Interface {
Get(url string) Getter
// In the previous Method, Get() returns a *gorequest.SuperAgent
// which allows chaining of methods
// Here I tried returning the interface itself
// But I get a 'wrong type for Get method' error when passing a gorequest instance
// have Get(string) *gorequest.SuperAgent
// want Get(string) Getter
End(callback ...func(response *gorequest.Response, body string, errs []error)) (*gorequest.Response, string, []error)
// I have no idea how to handle the param and returned *gorequest.Response here
// Put another interface ?
// Tried replacing it with *http.Response but not quite understanding it
}
func Method(req Getter) string {
...
}
Итак, как вы можете видеть, я запутался в нескольких моментах здесь и не смог найти хороший источник для изучения. Любые указатели будут с благодарностью
1 ответ
Помимо определения Getter
Интерфейс вы также можете определить тонкую оболочку вокруг *gorequest.SuperAgent
который реализует Getter
интерфейс.
type saGetter struct {
sa *gorequest.SuperAgent
}
func (g *saGetter) Get(url string) Getter {
g.sa = g.sa.Get(url)
return g
}
func (g *saGetter) Set(param string, value string) Getter {
g.sa = g.sa.Set(param, value)
return g
}
func (g *saGetter) End(callback ...func(response *gorequest.Response, body string, errs []error)) (*gorequest.Response, string, []error) {
return g.sa.End(callback...)
}
Тогда с вашим Method
определяется как:
// subpackage.go
func Method(req Getter) string {
req.Get("http://www.foo.com").Set("bar", "baz")
_, body, _ := req.End()
return body
}
Вы можете использовать saGetter
в основном так:
// main.go
func main() {
req := gorequest.New()
result := subpackage.Method(&saGetter{req})
fmt.Println(result)
}
Потом издеваться Getter
для тестирования Method
реализация проста.
Тем не менее, я согласен с комментариями @JimB, которые вам, вероятно, не нужны gorequest
и используя net/http
как правило, лучший выбор.