日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go的net/http

發(fā)布時間:2024/9/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的net/http 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(shù)

服務端函數(shù)

func Handle(pattern string, handler Handler)將handler按照指定的格式注冊到 DefaultServeMux,ServeMux解釋了模式匹配規(guī)則 func HandleFunc(pattern string, handler func(ResponseWriter, *Request))同上,主要用來實現(xiàn)動 態(tài)文件內(nèi)容的展示,這點與ServerFile()不同的地方。 func ListenAndServe(addr string, handler Handler) error監(jiān)聽TCP網(wǎng)絡地址addr然后調(diào)用具有 handler的Serve去處理連接請求.通常情況下Handler是nil,使用默認的DefaultServeMux func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error該函數(shù)與ListenAndServe功能基本相同,二者不同之處是該函數(shù)需要HTTPS連接.也就是說,必須給該服務 Serve提供一個包含整數(shù)的秘鑰的文件,如果證書是由證書機構(gòu)簽署的,那么證書文件必須是服務證書之后跟著CA 證書. func ServeFile(w ResponseWriter, r *Request, name string)利用指定的文件或者目錄的內(nèi)容來響應 相應的請求. func SetCookie(w ResponseWriter, cookie *Cookie)給w設定cookie func StatusText(code int) string對于http狀態(tài)碼返回文本表示,如果這個code未知,則返回空的字符串 func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser該函數(shù)類似于 io.LimitReader但是該函數(shù)是用來限制請求體的大小.與io.LimitReader不同的是,該函數(shù)返回一個 ReaderCloser,當讀超過限制時,返回一個non-EOF,并且當Close方法調(diào)用時,關閉底層的reader.該函數(shù)組織 客戶端惡意發(fā)送大量請求,浪費服務器資源. func ParseHTTPVersion(vers string) (major, minor int, ok bool)解析http字符串版本進行解 析,”HTTP/1.0” 返回 (1, 0, true) func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)返回一個用于傳輸?shù)拇砗?數(shù),該函數(shù)總是返回相同的URL func Redirect(w ResponseWriter, r *Request, urlStr string, code int)返回一個重定向的url給指 定的請求,這個重定向url可能是一個相對請求路徑的一個相對路徑. func Serve(l net.Listener, handler Handler) error該函數(shù)接受listener l的傳入http連接,對于每 一個連接創(chuàng)建一個新的服務協(xié)程,這個服務協(xié)程讀取請求然后調(diào)用handler來給他們響應.handler一般為nil,這 樣默認的DefaultServeMux被使用.

客戶端函數(shù)

Client具有Do,Get,Head,Post以及PostForm等方法。 其中Do方法可以對Request進行一系列的設定,而其 他的對request設定較少。如果Client使用默認的Client,則其中的Get,Head,Post以及PostForm方法相當于 默認的http.Get,http.Post,http.Head以及http.PostForm函數(shù)。 func (c *Client) Do(req *Request) (resp *Response, err error)Do發(fā)送http請求并且返回一個http響 應,遵守client的策略,如重定向,cookies以及auth等.錯誤經(jīng)常是由于策略引起的,當err是nil時,resp總會包含 一個非nil的resp.body.當調(diào)用者讀完resp.body之后應該關閉它,如果resp.body沒有關閉,則Client底層 RoundTripper將無法重用存在的TCP連接去服務接下來的請求,如果resp.body非nil,則必須對其進行關閉.通常 來說,經(jīng)常使用Get,Post,或者PostForm來替代Do. func (c *Client) Get(url string) (resp *Response, err error)利用get方法請求指定的url.Get請求 指定的頁面信息,并返回實體主體。 func (c *Client) Head(url string) (resp *Response, err error)利用head方法請求指定的url,Head 只返回頁面的首部。 func (c *Client) Post(url string, bodyType string, body io.Reader) (resp *Response, err error)利用post方法請求指定的URl,如果body也是一個io.Closer,則在請求之后關閉它 func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)利用post方 法請求指定的url,利用data的key和value作為請求體. Do方法可以靈活的對request進行配置,然后進行請求。利用http.Client以及http.NewRequest來模擬請求。模 擬request中帶有cookie的請求。示例如下:

例子

package main import (// "encoding/json""fmt""io/ioutil""net/http""strconv" ) func main() {client := &http.Client{}request, err := http.NewRequest("GET", "http://www.baidu.com", nil)if err != nil {fmt.Println(err)}cookie := &http.Cookie{Name: "userId", Value: strconv.Itoa(12345)}request.AddCookie(cookie) //request中添加cookie//設置request的headerrequest.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")request.Header.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3")request.Header.Set("Accept-Encoding", "gzip,deflate,sdch")request.Header.Set("Accept-Language", "zh-CN,zh;q=0.8")request.Header.Set("Cache-Control", "max-age=0")request.Header.Set("Connection", "keep-alive")response, err := client.Do(request)if err != nil {fmt.Println(err)return}defer response.Body.Close()fmt.Println(response.StatusCode)if response.StatusCode == 200 {r, err := ioutil.ReadAll(response.Body)if err != nil {fmt.Println(err)}fmt.Println(string(r))} }

結(jié)構(gòu)

客戶端

type ClientClient是一個http客戶端,默認客戶端(DefaultClient)將使用默認的發(fā)送機制的客戶端.Client的Transport字段一般會含有內(nèi)部狀態(tài)(緩存TCP連接),因此Client類型值應盡量被重用而不是創(chuàng)建新的。多個協(xié)程并發(fā)使用Clients是安全的.

type Client struct { // Transport指定執(zhí)行獨立、單次HTTP請求的機制如果Transport為nil,則使用DefaultTransport。Transport RoundTripper // CheckRedirect指定處理重定向的策略,如果CheckRedirect非nil,client將會在調(diào)用重定向之前調(diào)用它。參 數(shù)req和via是將要執(zhí)行的請求和已經(jīng)執(zhí)行的請求(時間越久的請求優(yōu)先執(zhí)行),如果CheckRedirect返回一個錯 誤,client的GetGet方法不會發(fā)送請求req,而是回之前得到的響應和該錯誤。如果CheckRedirect為nil,會采用 默認策略:在連續(xù)10次請求后停止。CheckRedirect func(req *Request, via []*Request) error// Jar指定cookie管理器,如果Jar為nil,在請求中不會發(fā)送cookie,在回復中cookie也會被忽略。Jar CookieJar // Timeout指定Client請求的時間限制,該超時限制包括連接時間、重定向和讀取response body時間。計時器 會在Head,Get,Post或Do方法返回后開始計時并在讀到response.body后停止計時。Timeout為零值表示不設置超 時。Client的Transport字段必須支持CancelRequest方法,否則Client會在嘗試用Head,Get,Post或Do方法執(zhí) 行請求時返回錯誤。Client的Transport字段默認值(DefaultTransport)支持CancelRequest方法。Timeout time.Duration }

?

type ConnState表示客戶端連接服務端的狀態(tài),其中ConnState常用狀態(tài)變量如下:const (// StateNew代表一個新的連接,將要立刻發(fā)送請求。// 連接從這個狀態(tài)開始,然后轉(zhuǎn)變?yōu)镾tateAlive或StateClosed。StateNew ConnState = iota// StateActive代表一個已經(jīng)讀取了請求數(shù)據(jù)1到多個字節(jié)的連接。// 用于StateAlive的Server.ConnState回調(diào)函數(shù)在將連接交付給處理器之前被觸發(fā),// 等到請求被處理完后,Server.ConnState回調(diào)函數(shù)再次被觸發(fā)。// 在請求被處理后,連接狀態(tài)改變?yōu)镾tateClosed、StateHijacked或StateIdle。StateActive// StateIdle代表一個已經(jīng)處理完了請求、處在閑置狀態(tài)、等待新請求的連接。// 連接狀態(tài)可以從StateIdle改變?yōu)镾tateActive或StateClosed。StateIdle// 代表一個被劫持的連接。這是一個終止狀態(tài),不會轉(zhuǎn)變?yōu)镾tateClosed。StateHijacked// StateClosed代表一個關閉的連接。// 這是一個終止狀態(tài)。被劫持的連接不會轉(zhuǎn)變?yōu)镾tateClosed。StateClosed ) type Cookie常用SetCooker用來給http的請求或者http的response設置cookietype Cookie struct {Name string //名字Value string //值Path string //路徑Domain string Expires time.Time //過期時間RawExpires string// MaxAge=0 意味著 沒有'Max-Age'屬性指定.// MaxAge<0 意味著 立即刪除cookie// MaxAge>0 意味著設定了MaxAge屬性,并且其單位是秒MaxAge intSecure boolHttpOnly boolRaw stringUnparsed []string // 未解析的屬性值對 }

func (c *Cookie) String() string該函數(shù)返回cookie的序列化結(jié)果。如果只設置了Name和Value字段,序列化結(jié)果可用于HTTP請求的Cookie頭或者HTTP回復的Set-Cookie頭;如果設置了其他字段,序列化結(jié)果只能用于HTTP回復的Set-Cookie頭。?
type CookieJar在http請求中,CookieJar管理存儲和使用cookies.Cookiejar的實現(xiàn)必須被多協(xié)程并發(fā)使用時是安全的.

type CookieJar interface {// SetCookies 處理從url接收到的cookie,是否存儲這個cookies取決于jar的策略和實現(xiàn)SetCookies(u *url.URL, cookies []*Cookie)// Cookies 返回發(fā)送到指定url的cookiesCookies(u *url.URL) []*Cookie }type Dir使用一個局限于指定目錄樹的本地文件系統(tǒng)實現(xiàn)一個文件系統(tǒng).一個空目錄被當做當前目錄 type Dir string func (d Dir) Open(name string) (File, error)type FileFile是通過FileSystem的Open方法返回的,并且能夠被FileServer實現(xiàn).該方法與*os.File行為表現(xiàn)一樣type File interface {io.Closerio.ReaderReaddir(count int) ([]os.FileInfo, error)Seek(offset int64, whence int) (int64, error)Stat() (os.FileInfo, error) }type FileSystem實現(xiàn)了對一系列指定文件的訪問,其中文件路徑之間通過分隔符進行分割type FileSystem interface {Open(name string) (File, error) }type Flusherresponsewriters允許http控制器將緩存數(shù)據(jù)刷新入client.然而如果client是通過http代理連接服務器,這個緩存數(shù)據(jù)也可能是在整個response結(jié)束后才能到達客戶端type Flusher interface {// Flush將任何緩存數(shù)據(jù)發(fā)送到clientFlush() }

服務端

type Handler實現(xiàn)Handler接口的對象可以注冊到HTTP服務端,為指定的路徑或者子樹提供服務。ServeHTTP應該將回復的header和數(shù)據(jù)寫入ResponseWriter接口然后返回。返回意味著該請求已經(jīng)結(jié)束,HTTP服務端可以轉(zhuǎn)移向該連接上的下一個請求。如果ServeHTTP崩潰panic,那么ServeHTTP的調(diào)用者假定這個panic的影響與活動請求是隔離的,二者互不影響.調(diào)用者恢復panic,將stack trace記錄到錯誤日志中,然后掛起這個連接.type Handler interface {ServeHTTP(ResponseWriter, *Request) }func FileServer(root FileSystem) HandlerFileServer返回一個使用FileSystem接口提供文件訪問服務的HTTP處理器??梢允褂胔ttpDir來使用操作系統(tǒng)的FileSystem接口實現(xiàn)。其主要用來實現(xiàn)靜態(tài)文件的展示。 func NotFoundHandler() Handler返回一個簡單的請求處理器,該處理器對任何請求都會返回”404 page not found” func RedirectHandler(url string, code int) Handler使用給定的狀態(tài)碼將它接受到的任何請求都重定向到給定的url func StripPrefix(prefix string, h Handler) Handler將請求url.path中移出指定的前綴,然后將省下的請求交給handler h來處理,對于那些不是以指定前綴開始的路徑請求,該函數(shù)返回一個http 404 not found 的錯誤. func TimeoutHandler(h Handler, dt time.Duration, msg string) Handler具有超時限制的handler,該函數(shù)返回的新Handler調(diào)用h中的ServerHTTP來處理每次請求,但是如果一次調(diào)用超出時間限制,那么就會返回給請求者一個503服務請求不可達的消息,并且在ResponseWriter返回超時錯誤. 其中FileServer經(jīng)常和StripPrefix一起連用,用來實現(xiàn)靜態(tài)文件展示,舉例如下:package main import ("fmt""net/http" ) func main() {http.Handle("/test/", http.FileServer(http.Dir("/home/work/"))) ///home/work/test/中必須有內(nèi)容http.Handle("/download/", http.StripPrefix("/download/", http.FileServer(http.Dir("/home/work/"))))http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp")))) //127.0.0.1:9999/tmpfiles/訪問的本地文件/tmp中的內(nèi)容http.ListenAndServe(":9999", nil) }type HandlerFuncHandlerFunc type是一個適配器,通過類型轉(zhuǎn)換我們可以將普通的函數(shù)作為HTTP處理器使用。如果f是一個具有適當簽名的函數(shù),HandlerFunc(f)通過調(diào)用f實現(xiàn)了Handler接口。type Hijacker interface {// Hijack讓調(diào)用者接管連接,在調(diào)用Hijack()后,http server庫將不再對該連接進行處理,對于該連接的管理和關閉責任將由調(diào)用者接管.Hijack() (net.Conn, *bufio.ReadWriter, error) //conn表示連接對象,bufrw代表該連接的讀寫緩存對象。 }Hijacker用法如下所示:package main import ("fmt""net/http" ) func HiJack(w http.ResponseWriter, r *http.Request) {hj, ok := w.(http.Hijacker)if !ok {http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)return}conn, bufrw, err := hj.Hijack()if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}defer conn.Close()bufrw.WriteString("Now we're speaking raw TCP. Say hi: \n")bufrw.Flush()fmt.Fprintf(bufrw, "You said: %s Bye.\n", "Good")bufrw.Flush() } func main() {http.HandleFunc("/hijack", HiJack)err := http.ListenAndServe(":9999", nil)if err != nil {fmt.Println(err)} }

?

總結(jié)

以上是生活随笔為你收集整理的Go的net/http的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。