goweb- 對請求的處理

来源:https://www.cnblogs.com/ygjzs/archive/2019/12/16/12052005.html
-Advertisement-
Play Games

對請求的處理 Go 語言的 net/http 包提供了一系列用於表示 HTTP 報文的結構,我們可以使用它 處理請求和發送相應,其中 Request 結構代表了客戶端發送的請求報文,下麵讓我們看 一下 Request 結構體 獲取請求 URL Request 結構中的 URL 欄位用於表示請求行中包 ...


對請求的處理

Go 語言的 net/http 包提供了一系列用於表示 HTTP 報文的結構,我們可以使用它
處理請求和發送相應,其中 Request 結構代表了客戶端發送的請求報文,下麵讓我們看
一下 Request 結構體

獲取請求 URL

Request 結構中的 URL 欄位用於表示請求行中包含的 URL,改欄位是一個指向
url.URL 結構的指針

 Path 欄位

註: 通過 r.URL.Path 只能得到 /hello

RawQuery 欄位

註: 通過 r.URL.RawQuery 得到的是 username=admin&password=123456

獲取請求頭中的信息

通過 Request 結果中的 Header 欄位用來獲取請求頭中的所有信息,Header 欄位
的類型是 Header 類型,而 Header 類型是一個 map[string][]string,string 類型的 key,
string 切片類型的值。

獲取請求頭中的所有信息

  • r.Header

  • 得到的結果如下:
map[User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36]
Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,ima
ge/apng,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-
CN,zh;q=0.9,en-US;q=0.8,en;q=0.7] Connection:[keep-alive] Upgrade-Insecure-
Requests:[1]]

獲取請求頭中的某個具體屬性的值,如獲取 Accept-Encoding 的值

  • 方式一:r.Header[“Accept-Encoding”]

    • 得到的是一個字元串切片
    • 結果[gzip, deflate, br]
  • 方式二:r.Header.Get(“Accept-Encoding”)

    • 得到的是字元串形式的值,多個值使用逗號分隔
    • 結果gzip, deflate, br

獲取請求體中的信息

請求和響應的主體都是有 Request 結構中的 Body 欄位表示,這個欄位的類型是
io.ReadCloser 介面,該介面包含了 Reader 介面和 Closer 介面,Reader 介面擁有 Read
方法,Closer 介面擁有 Close 方法

通過指定 method=”post”來發送一個 POST 請求

由於 GET 請求沒有請求體,所以我們需要在 HTML 頁面中創建一個 form 表單,通
過指定 method=”post”來發送一個 POST 請求

  • 表單
<html>
    <head>
        <meta charset="UTF-8"/>
    </head>
    <body>
        <form action="http://localhost:8080/getBody" method="POST" enctype="multipart/form-data">
            用戶名:<input type="text" name="username" /><br/>
            密碼:<input type="password" name="password" /><br/>
            <input type="submit" />
        </form>
    </body>
</html>
  • 伺服器處理請求的代碼
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
//獲取內容的長度
length := r.ContentLength
//創建一個位元組切片
body := make([]byte, length)
//讀取請求體
r.Body.Read(body)
fmt.Fprintln(w, "請求體中的內容是:", string(body))
}
func main() {
http.HandleFunc("/getBody", handler)
http.ListenAndServe(":8080", nil)
}
  • 在瀏覽器上顯示的結果

    • 請求體中的內容是: username=hanzong&password=666666

獲取請求參數

下麵我們就通過 net/http 庫中的 Request 結構的欄位以及方法獲取請求 URL 後面
的請求參數以及 form 表單中提交的請求參數

Form 欄位

1) 類型是 url.Values 類型,Form 是解析好的表單數據,包括 URL 欄位的 query
參數和 POST 或 PUT 的表單數據。
2) Form 欄位只有在調用 Request 的 ParseForm 方法後才有效。在客戶端,會忽
略請求中的本欄位而使用 Body 替代
1) 獲取表單中提交的請求參數(username 和 password)

  • 代碼
func handler(w http.ResponseWriter, r *http.Request) {
//解析表單
r.ParseForm()
//獲取請求參數
fmt.Fprintln(w, "請求參數為:", r.Form)
}
//註意:在執行 r.Form 之前一定要調用 ParseForm 方法
//結果
//請求參數為: map[password:[666666] username:[hanzong]]
  • d) 如果對 form 表單做一些修改,在 action 屬性的 URL 後面也添加相同的請求參
    數,如下:
<form
action="http://localhost:8080/getBody?username=admin&pwd=123456"
method="POST">
用 戶 名 : <input type="text" name="username"
value="hanzong"><br/>
密 碼 : <input type="password" name="password"
value="666666"><br/>
<input type="submit">
</form>

則執行結果如下:

請求參數為:map[username:[hanzong admin] password:[666666] pwd:[123456]]

  • 我們發現:表單中的請求參數 username 和 URL 中的請求參數
    username 都獲取到了,而且表單中的請求參數的值排在 URL 請求參
    數值的前面
  • 如果此時我們只想獲取表單中的請求參數該怎麼辦呢?那就需要使
    用 Request 結構中的 PostForm 欄位

PostForm 欄位

1) 類型也是 url.Values 類型,用來獲取表單中的請求參數

  • 將 r.Form 改為 r.PostForm 之後的代碼
func handler(w http.ResponseWriter, r *http.Request) {
//解析表單
r.ParseForm()
//獲取請求參數
fmt.Fprintln(w, "請求參數為:", r.PostForm)
}
  • 結果

請求參數為:map[username:[hanzong] password:[666666]]

2) 但是 PostForm 欄位只支持 application/x-www-form-urlencoded 編碼,如果
form 表單的 enctype 屬性值為 multipart/form-data,那麼使用 PostForm 欄位
無法獲取表單中的數據,此時需要使用 MultipartForm 欄位

  • 說明:form 表單的 enctype 屬性的預設值是 application/x-www-form-
    urlencoded 編 碼 , 實 現 上 傳 文 件 時 需 要 講 該 屬 性 的 值 設 置 為
    multipart/form-data 編碼格式

FormValue 方法和 e PostFormValue 方法

FormValue 方法

a) 可以通過 FormValue 方法快速地獲取某一個請求參數,該方法調用之前
會自動調用 ParseMultipartForm 和 ParseForm 方法對錶單進行解析

  • 代碼
func handler(w http.ResponseWriter, r *http.Request) {
//獲取請求參數
fmt.Fprintln(w, "請求參數username的值為:", r.FormValue("username"))
}
  • 結果

請求參數 username 的值為: hanzong

PostFormValue 方法

a) 可以通過 PostFormValue 方法快速地獲取表單中的某一個請求參數,該
方法調用之前會自動調用 ParseMultipartForm 和 ParseForm 方法對錶單
進行解析

  • 代碼
func handler(w http.ResponseWriter, r *http.Request) {
//獲取請求參數
fmt.Fprintln(w, "請求參數 username 的值為:", r.PostFormValue("username"))
}
  • 結果
  • 請求參數 username 的值為: hanzong

MultipartForm 欄位

為了取得 multipart/form-data 編碼的表單數據,我們需要用到 Request 結構的
ParseMultipartForm 方法和 MultipartForm 欄位,我們通常上傳文件時會將 form 表單的
enctype 屬性值設置為 multipart/form-data

1) 表單

<form action="http://localhost:8080/upload" method="POST"
enctype="multipart/form-data">
用 戶 名 : <input type="text" name="username"
value="hanzong"><br/>
文件:<input type="file" name="photo" /><br/>
<input type="submit">
</form>

1) 後臺處理請求代碼

package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
//解析表單
r.ParseMultipartForm(1024)

fmt.Fprintln(w, r.MultipartForm)
}
func main() {
http.HandleFunc("/upload", handler)
http.ListenAndServe(":8080", nil)
}

3) 瀏覽器顯示結果

&{map[username:[hanzong]] map[photo:[0xc042126000]]}

  • 結果中有兩個映射,第一個映射映射的是用戶名;第二個映射的值是一個地址
  • MuiltipartForm 欄位的類型為 *multipart.Form,multipart 包下 Form 結構的指
    針類型

  • 打開上傳的文件

func handler(w http.ResponseWriter, r *http.Request) {
//解析表單
r.ParseMultipartForm(1024)
fileHeader := r.MultipartForm.File["photo"][0]
file, err := fileHeader.Open()
if err == nil {
data, err := ioutil.ReadAll(file)
if err == nil {
fmt.Fprintln(w, string(data))
}
}
}

FormFile 方法

  • net/http 提供的 FormFile 方法可以快速的獲取被上傳的文件,但是只能處理上
    傳一個文件的情況。

  • 代碼
func handler(w http.ResponseWriter, r *http.Request) {
file, _, err := r.FormFile("photo")
if err == nil {
data, err := ioutil.ReadAll(file)

if err == nil {
fmt.Fprintln(w, string(data))
}
}
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 馬蜂窩技術原創文章,更多乾貨請搜索公眾號:mfwtech ​即時通訊(IM)功能對於電商平臺來說非常重要,特別是旅游電商。 從商品複雜性來看,一個旅游商品可能會包括用戶在未來一段時間的衣、食、住、行等方方面面;從消費金額來看,往往單次消費額度較大;對目的地的陌生、在行程中可能的問題,這些因素使用戶在 ...
  • 一、昨日內容回顧 成員 1、變數 1、成員變數--最常見 1、寫法: 變數前面加了self就是成員變數 這裡的self表示當前對象 一般是在構造方法中定義 2、調用: 對象.成員變數 3、作用: 可以在類中的不同方法間使用 有點局部的意思(每個對象的成員變數可以不同) 2、類變數(靜態變數) 1、寫... ...
  • From https://www.iteye.com/blog/unixboy-174173 堆大小設置JVM 中最大堆大小有三方面限制:相關操作系統的數據模型(32-bt還是64-bit)限制;系統的可用虛擬記憶體限制;系統的可用物理記憶體限制。32位系統下,一般限制在1.5G~2G;64為操作系統對 ...
  • 當服務端Channel 創建並且初始化完成之後,會將其註冊到 selector,通過語句config().group().register(channel)進行註冊工作,該方法最終調用 AbstractUnsafe 類的 register 方法。以下各圖是服務端Channel註冊到Selector上 ...
  • 一、is a、is like a、has a 1.is a(就是繼承) public class Animal{ public void method1{ } } public class Dog extends Animal{ } 2.is like a(就是實現) public interfac ...
  • 因為Jdk7及以前的日期時間類的不方便使用問題和線程安全問題等問題,2005年,Stephen Colebourne創建了Joda-Time庫,作為替代的日期和時間API。Stephen向JCP提交了一個規範,他本人作為規範的領導人,該規範就是JSR 310,在Java8中實現併發布。 Java8日 ...
  • 只對密碼進行md5加密很容易反推出來,另外兩個用戶的密碼相同時,資料庫保存相同的密碼。 解決方法是在用戶的短密碼後面加上一段長字元,再計算 md5,這樣反推出原始密碼就變得非常困難,而且即使兩個用戶密碼相同,資料庫保存的密碼也不一樣。加上的這段長字元,稱為鹽(Salt),通過這種方式加密的結果,稱... ...
  • 原本計劃緊張忙碌的考試月在圖書館和實驗室度過,結果突如其來為期兩周的軟體設計把課餘時間幾乎捆綁在了機房。軟設沒有太多知識上的要求,只要成品簡潔美觀、實用準確即可。考慮了很久決定要用Java swing做一個完善的連連看小游戲。 (一)工作計劃安排: 1.16周完成游戲界面的製作以及圖形消除功能的實現 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...