当前位置: 首页 > 科技观察

Golang语言最小HTTP客户端GoRequest

时间:2023-03-11 21:56:06 科技观察

1简介GoRequest是一个最小的HTTP客户端,作者受到Node.js库SuperAgent的启发。与Golang标准库net/http相比,GoRequest更易于使用。GoRequest的官方口号是“像机关枪一样发送请求”。GoRequest包括以下功能:支持HTTP请求方式:Get/Post/Put/Head/Delete/Patch/Options支持设置header请求头支持使用JSON字符串作为请求参数支持在多个请求中发送数据和文件支持通过代理发送requests支持设置请求超时时间支持TLS客户端设置支持设置重定向策略支持为请求设置cookieCookieJar-自动内存cookiejar支持请求头设置基本认证安装方式:gogetgithub.com/parnurzeal/gorequest2HTTP请求方式Golang发送一个简单的Get请求,使用net/http标准库和使用GoRequst库,这两种发送Get请求的方式都比较简单。示例代码如下:标准库方法:resp,err:=http.Get("http://example.com/")GoRequest库方法:request:=gorequest.New()resp,body,errs:=request.Get("http://example.com/").End()or(GoRequest方法不能重用对象)resp,body,errs:=gorequest.New().Get("http://example.com/").End()阅读上面两段代码,我们可以发现使用标准库发送Get请求比使用GoRequest库发送Get请求还要简单。但是,当我们需要稍微修改的时候,比如需要设置header头,设置Get请求的重定向策略。下面分别看看使用标准库和GoRequest库的两种实现。标准库方法: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)GoRequest库方法(其他HTTP请求方法同Get):request:=gorequest.New()resp,body,errs:=request.Get("http://example.com").RedirectPolicy(redirectPolicyFunc).Set("If-None-Match",`W/"wyzzy"`).End()读取上面两个paragraphs代码,不难发现使用GoRequest方法使得实现更加简单。使用标准库的方法,首先需要创建一个Client,然后使用不同的命令设置header头等操作,也就是实现一个HTTP请求而已。但是,使用GoRequest方法,只需链式调用两个方法即可轻松实现。3JSON格式请求参数在Golang语言中,如果使用标准库net/http发送请求参数为JSON格式的POST请求,首先需要使用标准的Marshal方法将map或struct类型的数据进行转换libraryencoding/jsonJSON格式的数据,并设置头参数Content-Type的值为application/json,然后创建一个Client,最终你的代码变得越来越长,越来越难维护。标准库方法: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","GoRequestiscoming!")client:=&http.Client{}resp,_:=client.Do(req)如果使用GoRequest库发送JSON格式请求参数的POST请求,因为它默认支持JSON格式请求参数,只需要一行代码即可实现。GoRequest库方法:request:=gorequest.New()resp,body,errs:=request.Post("http://example.com").Set("Notes","gorequstiscoming!").Send(`{"name":"backy","species":"dog"}`).End()4支持回调函数CallbackGoRequest库也支持回调函数,大家可以根据自己的项目需求灵活使用,示例代码回调函数的结构如下:funcprintStatus(respgorequest.Response,bodystring,errs[]error){fmt.Println(resp.Status)}gorequest.New().Get("http://example.com")。End(printStatus)5中的请求控制在Golang项目开发中,有时候我们可能需要对请求做一些额外的控制,比如超时处理、重试请求N次、重定向处理等,GoRequest库可以为我们提供通过一个简单的实现。超时处理:request:=gorequest.New().Timeout(2*time.Millisecond)resp,body,errs:=request.Get("http://example.com").End()需要注意的是,Timeout是Dial连接和IO读写的耗时总和,与时间参数比较。重试请求:request:=gorequest.New()resp,body,errs:=request.Get("http://example.com/").Retry(3,5*time.Second,http.StatusBadRequest,http.StatusInternalServerError).End()看上面的代码,意思是当服务端返回http.StatusBadRequest或http.StatusInternalServerError时,每5秒重试一次请求,一共重试3次。重定向处理:request:=gorequest.New()resp,body,errs:=request.Get("http://example.com/").RedirectPolicy(func(reqRequest,via[]*Request)error{ifreq.URL.Scheme!="https"{returnhttp.ErrUseLastResponse}}).End()看上面的代码,意思是将http请求重定向到https请求。6返回结果处理方法读者可能已经发现,上面的示例代码都是以End结尾的,也就是说返回结果是字符串类型。如果我们希望返回结果是其他类型,比如byte类型,结构类型,End可以分别换成EndBytes和EndStruct。EndBytes格式:resp,bodyBytes,errs:=gorequest.New().Get("http://example.com/").EndBytes()EndStruct格式:heyYoustruct{Heystring`json:"hey"`}varheyYouheyYouresp,_,errs:=gorequest.New().Get("http://example.com/").EndStruct(&heyYou)7总结本文介绍了GoRequest,一个Golang语言的最小HTTP客户端,以及如何使用它。它比标准库net/http更容易使用。当我们在项目开发中需要使用HTTP方式调用接口时,强烈推荐使用GoRequest库。GoRequest的底层在大多数用例中都是基于http.Client实现的,所以调用一次gorequest.New()得到的对象应该尽可能多次使用。GoRequest除了上面介绍的JSON参数外,还支持Struct和File。感兴趣的读者可以参考官方文档了解相关内容。本文转载自微信公众号《Golang语言开发栈》,可通过以下二维码关注。转载本文请联系Golang语言开发栈公众号。