最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng)

 更新時(shí)間:2022年08月08日 11:50:08   作者:itzhuzhu.  
本文主要介紹了Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

請求:

HTTP 請求報(bào)文由請求行、請求頭部、空行、請求包體4個(gè)部分組成,如下圖所示:

請求行:

請求行由方法字段、URL 字段 和HTTP 協(xié)議版本字段 3個(gè)部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST。

GET:

  • 當(dāng)客戶端要從服務(wù)器中讀取某個(gè)資源時(shí),使用GET 方法。GET 方法要求服務(wù)器將URL 定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶端,即向服務(wù)器請求某個(gè)資源。
  • 使用GET方法時(shí),請求參數(shù)和對應(yīng)的值附加在 URL 后面,利用一個(gè)問號(hào)(“?”)代表URL 的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制,因此GET方法不適合用于上傳數(shù)據(jù)。
  • 通過GET方法來獲取網(wǎng)頁時(shí),參數(shù)會(huì)顯示在瀏覽器地址欄上,因此保密性很差。

POST:

  • 當(dāng)客戶端給服務(wù)器提供信息較多時(shí)可以使用POST 方法,POST 方法向服務(wù)器提交數(shù)據(jù),比如完成表單數(shù)據(jù)的提交,將數(shù)據(jù)提交給服務(wù)器處理。
  • GET 一般用于獲取/查詢資源信息,POST 會(huì)附帶用戶數(shù)據(jù),一般用于更新資源信息。POST 方法將請求參數(shù)封裝在HTTP 請求數(shù)據(jù)中,而且長度沒有限制,因?yàn)镻OST攜帶的數(shù)據(jù),在HTTP的請求正文中,以名稱/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù)。

請求頭:

請求頭部為請求報(bào)文添加了一些附加信息,由“名/值”對組成,每行一對,名和值之間使用冒號(hào)分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息,典型的請求頭有:

請求頭含義
User-Agent請求的瀏覽器類型
Accept客戶端可識(shí)別的響應(yīng)內(nèi)容類型列表,星號(hào)“ * ”用于按范圍將類型分組,用“ / ”指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型
Accept-Language客戶端可接受的自然語言
Accept-Encoding客戶端可接受的編碼壓縮格式
Accept-Charset可接受的應(yīng)答的字符集
Host請求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP 地址,即虛擬主機(jī)
connection連接方式(close或keepalive)
Cookie存儲(chǔ)于客戶端擴(kuò)展字段,向同一域名的服務(wù)端發(fā)送屬于該域的cookie

空行:

最后一個(gè)請求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭。

請求包體:

請求包體不在GET方法中使用,而在POST方法中使用。POST方法適用于需要客戶填寫表單的場合。與請求包體相關(guān)的最常使用的是包體類型Content-Type和包體長度Content-Length。

響應(yīng):

響應(yīng)報(bào)文格式說明
HTTP 響應(yīng)報(bào)文由狀態(tài)行、響應(yīng)頭部、空行、響應(yīng)包體4個(gè)部分組成,如下圖所示:

狀態(tài)行:

狀態(tài)行由 HTTP 協(xié)議版本字段、狀態(tài)碼和狀態(tài)碼的描述文本3個(gè)部分組成,他們之間使用空格隔開。

狀態(tài)碼:狀態(tài)碼由三位數(shù)字組成,第一位數(shù)字表示響應(yīng)的類型,常用的狀態(tài)碼有五大類如下所示:

狀態(tài)碼含義
1xx表示服務(wù)器已接收了客戶端請求,客戶端可繼續(xù)發(fā)送請求
2xx表示服務(wù)器已成功接收到請求并進(jìn)行處理
3xx表示服務(wù)器要求客戶端重定向
4xx表示客戶端的請求有非法內(nèi)容
5xx表示服務(wù)器未能正常處理客戶端的請求而出現(xiàn)意外錯(cuò)誤

常見的狀態(tài)碼舉例:

狀態(tài)碼含義
200 OK客戶端請求成功
400 Bad Request請求報(bào)文有語法錯(cuò)誤
401 Unauthorized未授權(quán)
403 Forbidden服務(wù)器拒絕服務(wù)
404 Not Found請求的資源不存在
500 Internal Server Error服務(wù)器內(nèi)部錯(cuò)誤
503 Server Unavailable服務(wù)器臨時(shí)不能處理客戶端請求(稍后可能可以)

響應(yīng)頭可能包括:

響應(yīng)頭含義
Location Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置
Server Server響應(yīng)報(bào)頭域包含了服務(wù)器用來處理請求的軟件信息及其版本
Vary指示不可緩存的請求頭列表
Connection連接方式

空行:

最后一個(gè)響應(yīng)頭部之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有響應(yīng)頭部。

響應(yīng)包體:

服務(wù)器返回給客戶端的文本信息

響應(yīng)報(bào)文格式:

要想獲取響應(yīng)報(bào)文,必須先發(fā)送請求報(bào)文給web服務(wù)器。服務(wù)器收到并解析瀏覽器(客戶端)發(fā)送的請求報(bào)文后,借助http協(xié)議,回復(fù)相對應(yīng)的響應(yīng)報(bào)文。可以用net/http包,創(chuàng)建一個(gè)最簡單的服務(wù)器,給瀏覽器回發(fā)送響應(yīng)包。首先注冊處理函數(shù)http.HandleFunc(),設(shè)置回調(diào)函數(shù)handler。而后綁定服務(wù)器的監(jiān)聽地址http.ListenAndserve()。這個(gè)服務(wù)器啟動(dòng)后,當(dāng)有瀏覽器發(fā)送請求,回調(diào)函數(shù)被調(diào)用,會(huì)向?yàn)g覽器回復(fù)“hello world”作為網(wǎng)頁內(nèi)容。當(dāng)然,是按照http協(xié)議的格式進(jìn)行回復(fù)。

HTTP服務(wù)端實(shí)現(xiàn):

Go語言標(biāo)準(zhǔn)庫內(nèi)建提供了net/http包,涵蓋了HTTP客戶端和服務(wù)端的具體實(shí)現(xiàn)。使用net/http包,我們可以很方便地編寫HTTP客戶端或服務(wù)端的程序。

package main

import (
	"fmt"
	"net/http"
)

func main() {
	/**
	注冊回調(diào)函數(shù),該回調(diào)函數(shù)會(huì)在服務(wù)器被訪問時(shí)自動(dòng)被調(diào)用
	func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
		pattern:訪問服務(wù)器文件位置
		handler:回調(diào)函數(shù)名,函數(shù)必須是ResponseWriter, *Request類型作為參數(shù)
	*/
	http.HandleFunc("/itzhuzhu", myHandlerFunc)

	/**
	綁定服務(wù)器監(jiān)聽地址
	func ListenAndServe(addr string, handler Handler) error
		addr:要監(jiān)聽的地址
		handler:回調(diào)函數(shù),為空則調(diào)用系統(tǒng)默認(rèn)的回調(diào)函數(shù)
	*/
	http.ListenAndServe("127.0.0.1:8000", nil)
}

/**
	ResponseWriter:寫給客戶端的數(shù)據(jù)內(nèi)容
	Request:從客戶端讀取到的數(shù)據(jù)內(nèi)容
*/
func myHandlerFunc(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("ResponseWriter Test"))
	fmt.Println("Header:", r.Header)
	fmt.Println("URL:", r.URL)
	fmt.Println("Method:", r.Method)
	fmt.Println("Host:", r.Host)
	fmt.Println("RemoteAddr:", r.RemoteAddr)
	fmt.Println("Body:", r.Body)
}

HTTP客戶端實(shí)現(xiàn):

客戶端模擬瀏覽器發(fā)送請求:

package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	// 客戶端連接服務(wù)器
	dial, err := net.Dial("tcp", "127.0.0.1:8000")
	errFunction("net.Dial err:", err)
	defer dial.Close()

	// 模擬瀏覽器
	requstHttpHeader := "GET /itzhuzhu HTTP/1.1\r\nHost:127.0.0.1:8000\r\n\r\n"

	// 給服務(wù)器發(fā)送請求報(bào)文
	dial.Write([]byte(requstHttpHeader))

	buf := make([]byte, 1024)

	// 讀取服務(wù)器的回復(fù)
	read, err := dial.Read(buf)
	errFunction("dial.Read err:", err)
	fmt.Println( string(buf[:read]))
}

func errFunction(describe string, err error) {
	if err != nil {
		fmt.Println(describe, err)
		os.Exit(1)
	}
}

服務(wù)器發(fā)送的響應(yīng)包體被保存在Body中??梢允褂盟峁┑腞ead方法來獲取數(shù)據(jù)內(nèi)容。保存至切片緩沖區(qū)中,拼接成一個(gè)完整的字符串來查看。
結(jié)束的時(shí)候,需要調(diào)用Body中的Close()方法關(guān)閉io。

package main

import (
	"fmt"
	"net/http"
)

func main()  {
	// 使用Get方法獲取服務(wù)器響應(yīng)包數(shù)據(jù)
	resp, err := http.Get("http://www.baidu.com")
	if err != nil {
		fmt.Println("Get err:", err)
		return
	}
	defer resp.Body.Close()

	// 獲取服務(wù)器端讀到的數(shù)據(jù)
	fmt.Println("Status = ", resp.Status)           // 狀態(tài)
	fmt.Println("StatusCode = ", resp.StatusCode)   // 狀態(tài)碼
	fmt.Println("Header = ", resp.Header)           // 響應(yīng)頭部
	fmt.Println("Body = ", resp.Body)               // 響應(yīng)包體

	buf := make([]byte, 4096)         // 定義切片緩沖區(qū),存讀到的內(nèi)容
	var result string
	// 獲取服務(wù)器發(fā)送的數(shù)據(jù)包內(nèi)容
	for {
		n, err := resp.Body.Read(buf)  // 讀body中的內(nèi)容。
		if n == 0 {
			fmt.Println("Body.Read err:", err)
			break
		}
		result += string(buf[:n])     // 累加讀到的數(shù)據(jù)內(nèi)容
	}
	// 打印從body中讀到的所有內(nèi)容
	fmt.Println("result = ", result)
}

到此這篇關(guān)于Golang實(shí)現(xiàn)HTTP編程請求和響應(yīng)的文章就介紹到這了,更多相關(guān)Golang HTTP編程請求和響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例

    golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例

    這篇文章主要為大家介紹了golang操作連接數(shù)據(jù)庫實(shí)現(xiàn)mysql事務(wù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 6行代碼快速解決golang TCP粘包問題

    6行代碼快速解決golang TCP粘包問題

    在用golang開發(fā)人工客服系統(tǒng)的時(shí)候碰到了粘包問題,那么什么是粘包呢?下面這篇文章主要給大家介紹了關(guān)于如何通過6行代碼快速解決golang TCP粘包問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 詳解Golang實(shí)現(xiàn)請求限流的幾種辦法

    詳解Golang實(shí)現(xiàn)請求限流的幾種辦法

    這篇文章主要介紹了詳解Golang實(shí)現(xiàn)請求限流的幾種辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • go語言中嵌套結(jié)構(gòu)體的實(shí)現(xiàn)

    go語言中嵌套結(jié)構(gòu)體的實(shí)現(xiàn)

    在Go語言中,嵌套結(jié)構(gòu)體可定義為一個(gè)結(jié)構(gòu)體內(nèi)包含另一個(gè)結(jié)構(gòu)體,嵌套可以是值嵌套或指針嵌套,兩者在內(nèi)存分配和修改影響上有顯著區(qū)別,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • Go Asynq異步任務(wù)處理的實(shí)現(xiàn)

    Go Asynq異步任務(wù)處理的實(shí)現(xiàn)

    Asynq是一個(gè)新興的異步任務(wù)處理解決方案,它提供了輕量級(jí)的、易于使用的API,本文主要介紹了Go Asynq異步任務(wù)處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-06-06
  • golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼

    golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼

    滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過更細(xì)粒度對數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下
    2022-10-10
  • golang構(gòu)建工具M(jìn)akefile使用詳解

    golang構(gòu)建工具M(jìn)akefile使用詳解

    這篇文章主要為大家介紹了golang構(gòu)建工具M(jìn)akefile的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Golang中SQLX庫的高級(jí)操作

    詳解Golang中SQLX庫的高級(jí)操作

    sqlx是Golang中的一個(gè)知名三方庫,其為Go標(biāo)準(zhǔn)庫database/sql提供了一組擴(kuò)展支持,下面就來和大家分享一下SQLX庫的高級(jí)操作吧,希望對大家有所幫助
    2023-06-06
  • Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法

    Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法

    這篇文章主要介紹了Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法,實(shí)例分析了sort排序所涉及的方法與相關(guān)的使用技巧,需要的朋友可以參考下
    2015-02-02
  • CSP communicating sequential processes并發(fā)模型

    CSP communicating sequential processes并發(fā)模型

    這篇文章主要為大家介紹了CSP communicating sequential processes并發(fā)模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評論

运城市| 布拖县| 广丰县| 浠水县| 祁门县| 峡江县| 石城县| 盐边县| 郴州市| 芦溪县| 虞城县| 卢湾区| 甘泉县| 沾化县| 昌江| 亚东县| 新干县| 博爱县| 崇文区| 慈利县| 丹江口市| 梧州市| 襄汾县| 河曲县| 屯门区| 临沭县| 大田县| 崇左市| 永昌县| 孙吴县| 镇远县| 阿拉善盟| 吴桥县| 孝义市| 清新县| 华蓥市| 巫溪县| 四会市| 广昌县| 房产| 曲麻莱县|