在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:parnurzeal/gorequest开源软件地址:https://github.com/parnurzeal/gorequest开源编程语言:Go 100.0%开源软件介绍:GoRequestGoRequest -- Simplified HTTP client ( inspired by famous SuperAgent lib in Node.js ) "Shooting Requests like a Machine Gun" - GopherSending request has never been as fun nor easier than this. It comes with lots of features:
Installation$ go get github.com/parnurzeal/gorequest DocumentationSee Go Doc or Go Walker for usage and details. StatusWhy should you use GoRequest?GoRequest makes thing much more simple for you, making http client more awesome and fun like SuperAgent + golang style usage. This is what you normally do for a simple GET without GoRequest: resp, err := http.Get("http://example.com/") With GoRequest: request := gorequest.New()
resp, body, errs := request.Get("http://example.com/").End() Or below if you don't want to reuse it for other requests. resp, body, errs := gorequest.New().Get("http://example.com/").End() How about getting control over HTTP client headers, redirect policy, and etc. Things can quickly get more complicated in golang. You need to create a Client, set headers in a different command, ... just to do only one GET client := &http.Client{
CheckRedirect: redirectPolicyFunc,
}
req, err := http.NewRequest("GET", "http://example.com", nil)
req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req) Why make things ugly while you can just do it as follows: request := gorequest.New()
resp, body, errs := request.Get("http://example.com").
RedirectPolicy(redirectPolicyFunc).
Set("If-None-Match", `W/"wyzzy"`).
End() DELETE, HEAD, POST, PUT, PATCH are now supported and can be used in the same way as GET: request := gorequest.New()
resp, body, errs := request.Post("http://example.com").End()
// PUT -> request.Put("http://example.com").End()
// DELETE -> request.Delete("http://example.com").End()
// HEAD -> request.Head("http://example.com").End()
// ANYTHING -> request.CustomMethod("TRACE", "http://example.com").End() JSONFor a JSON POST with standard libraries, you might need to marshal map data structure to json format, set headers to 'application/json' (and other headers if you need to) and declare http.Client. So, your code becomes longer and harder to maintain: m := map[string]interface{}{
"name": "backy",
"species": "dog",
}
mJson, _ := json.Marshal(m)
contentReader := bytes.NewReader(mJson)
req, _ := http.NewRequest("POST", "http://example.com", contentReader)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Notes","GoRequest is coming!")
client := &http.Client{}
resp, _ := client.Do(req) Compared to our GoRequest version, JSON is for sure a default. So, it turns out to be just one simple line!: request := gorequest.New()
resp, body, errs := request.Post("http://example.com").
Set("Notes","gorequst is coming!").
Send(`{"name":"backy", "species":"dog"}`).
End() Moreover, it also supports struct type. So, you can have a fun Mix & Match sending the different data types for your request: type BrowserVersionSupport struct {
Chrome string
Firefox string
}
ver := BrowserVersionSupport{ Chrome: "37.0.2041.6", Firefox: "30.0" }
request := gorequest.New()
resp, body, errs := request.Post("http://version.com/update").
Send(ver).
Send(`{"Safari":"5.1.10"}`).
End() Not only for Send() but Query() is also supported. Just give it a try! :) CallbackMoreover, GoRequest also supports callback function. This gives you much more flexibility on using it. You can use it any way to match your own style! Let's see a bit of callback example: func printStatus(resp gorequest.Response, body string, errs []error){
fmt.Println(resp.Status)
}
gorequest.New().Get("http://example.com").End(printStatus) Multipart/Form-DataYou can specify the content-type of the request to type gorequest.New().Post("http://example.com/").
Type("multipart").
Send(`{"query1":"test"}`).
End() The f, _ := filepath.Abs("./file2.txt")
bytesOfFile, _ := ioutil.ReadFile(f)
gorequest.New().Post("http://example.com/").
Type("multipart").
SendFile("./file1.txt").
SendFile(bytesOfFile, "file2.txt", "my_file_fieldname").
End() Check the docs for ProxyIn the case when you are behind proxy, GoRequest can handle it easily with Proxy func: request := gorequest.New().Proxy("http://proxy:999")
resp, body, errs := request.Get("http://example-proxy.com").End()
// To reuse same client with no_proxy, use empty string:
resp, body, errs = request.Proxy("").Get("http://example-no-proxy.com").End() Basic AuthenticationTo add a basic authentication header: request := gorequest.New().SetBasicAuth("username", "password")
resp, body, errs := request.Get("http://example-proxy.com").End() TimeoutTimeout can be set in any time duration using time package: request := gorequest.New().Timeout(2*time.Millisecond)
resp, body, errs:= request.Get("http://example.com").End() Timeout func defines both dial + read/write timeout to the specified time parameter. EndBytesThanks to @jaytaylor, we now have EndBytes to use when you want the body as bytes. The callbacks work the same way as with resp, bodyBytes, errs := gorequest.New().Get("http://example.com/").EndBytes() EndStructWe now have EndStruct to use when you want the body as struct. The callbacks work the same way as with Supposing the URL http://example.com/ returns the body heyYou struct {
Hey string `json:"hey"`
}
var heyYou heyYou
resp, _, errs := gorequest.New().Get("http://example.com/").EndStruct(&heyYou) RetrySupposing you need retry 3 times, with 5 seconds between each attempt when gets a BadRequest or a InternalServerError request := gorequest.New()
resp, body, errs := request.Get("http://example.com/").
Retry(3, 5 * time.Second, http.StatusBadRequest, http.StatusInternalServerError).
End() Handling RedirectsRedirects can be handled with RedirectPolicy which behaves similarly to net/http Client's CheckRedirect function. Simply specify a function which takes the Request about to be made and a slice of previous Requests in order of oldest first. When this function returns an error, the Request is not made. For example to redirect only to https endpoints: request := gorequest.New()
resp, body, errs := request.Get("http://example.com/").
RedirectPolicy(func(req Request, via []*Request) error {
if req.URL.Scheme != "https" {
return http.ErrUseLastResponse
}
}).
End() CloneYou can reuse settings of a Request by cloning it before making any requests. This can be useful if you wish to re-use the SuperAgent across multiple requests without worrying about concurrency or having too many Transports being created. Clones will copy the same settings (headers, query, etc..), but will only shallow copy any "Data" given to it. They will also share the same Transport and http.Client. baseRequest := gorequest.New()
// apply anything you want to these settings. Eg:
baseRequest.Timeout(10 * time.Millisecond).
BasicAuth("user", "password")
// then reuse the base request elsewhere, cloning before modifying or using it.
resp, body, errs := baseRequest.Clone().Get("http://exmaple.com/").End() DebugFor debugging, GoRequest leverages You can just use Thanks to @QuentinPerez, we can see even how gorequest is compared to CURL by using NotedAs the underlying gorequest is based on http.Client in most use cases, gorequest.New() should be called once and reuse gorequest as much as possible. Contributing to GoRequest:If you find any improvement or issue you want to fix, feel free to send me a pull request with testing. Thanks to all contributors thus far: Also, co-maintainer is needed here. If anyone is interested, please email me (parnurzeal at gmail.com) Credits
LicenseGoRequest is MIT License. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论