怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...
0、GET/POST 請求數據
在 PHP 中,可以直接通過全局變量 $_GET 和 $_POST 快速獲取 GET/POST 請求數據,GET 請求數據主要是 URL 查詢字符串中包含的參數,以前面在線論壇項目的群組詳情頁為例:
http://localhost:8080/thread/read?id=adb02107-d7c3-4f27-4de4-b586f231380e上述 URL 請求中的 id=adb02107-d7c3-4f27-4de4-b586f231380e 就屬于 GET 請求數據,也就是查詢字符串,而對于用戶登錄表單:
當用戶輸入注冊郵箱和密碼后點擊「登錄」按鈕,會將輸入框中的數據作為請求實體發送 POST 請求到服務端,執行登錄認證,這里的表單數據就是 POST 請求數據,如果我們查看表單請求路由的 HTTP 報文:
就會看到表單請求數據,也就是上文提到的 HTTP 請求實體。
當然根據對服務端資源的操作類型不同,可以進一步細分為 POST、PUT、PATCH、DELETE 等包含請求實體的請求方法,為了簡化模型,我們這里只討論 POST 請求,而且其他幾種請求方法也可以統一通過 POST 請求完成,通常只有在設計遵循 RESTful 風格的 API 接口時,才會嚴格劃分不同的請求方法,關于這一點,后面介紹 REST + JSON 接口時再詳細討論。
1、Form
Go 語言中獲取用戶請求數據的方式要更復雜一些,Go 也為此提供多個不同的結構體幫助我們讀取不同請求類型的數據,首先,我們可以通過請求對象上的 Form 讀取所有 GET/POST 請求數據,在 handlers/post.go 中新增 EditPost 方法如下:
func?EditPost(w?http.ResponseWriter,?r?*http.Request)??{????r.ParseForm()
????fmt.Fprintln(w,?r.Form)
}
需要注意的是,在通過 r.Form 獲取所有請求數據之前,必須要先通過 r.ParseForm() 解析所有請求數據,否則無法獲取數據。
在 routes/web.go 中新增一個路由:
WebRoute{????"UpdatePost",
????"POST",
????"/post/edit",
????handlers.EditPost,
},
然后我們重啟 HTTP 服務器,在命令行通過 curl 發起一個包含不同類型請求數據的請求:
可以看到,打印結果表明 r.Form 是一個包含所有請求數據的字典類型(map),包含 URL 查詢字符串和 POST 請求數據,這是一個 POST 請求,如果是 GET 請求呢?我們為 EditPost 定義一個 GET 請求路由:
WebRoute{????"EditPost",
????"GET",
????"/post/edit",
????handlers.EditPost,
},
再重啟 HTTP 服務器,發起一個只包含查詢字符串的 GET 請求(默認是 GET 請求,不需要通過 -X GET 指定):
同樣可以打印出和 POST 請求完全一樣的結果。
因此,request 對象上的 Form 可以獲取所有請求參數,包括查詢字符串和請求實體,并且不限請求類型。如果你想要進一步要獲取指定的參數值,可以以索引方式獲取指定參數對應的值,也可以通過 Form 提供的 Get 方法,就像我們從一個普通字典類型獲取鍵值一樣:
id1?:=?r.Form["id"]id2?:=?r.Form.Get("id")
fmt.Println(id1)
fmt.Println(id2)
只不過兩者的返回值類型不一樣,前者是一個字符串切片,后者是一個字符串值:
[1]1
2、PostForm
上面的結果同時返回了查詢字符串和請求實體,如果只想獲取請求實體(即 POST 表單中的數據),可以通過 PostForm 實現:
func?EditPost(w?http.ResponseWriter,?r?*http.Request)??{????r.ParseForm()
????id?:=?r.Form.Get("id")
????fmt.Println("post?id:",?id)
????fmt.Println("form?data:",?r.PostForm)
????io.WriteString(w,?"表單提交成功")
}
這樣一來,就只能獲取到 POST 數據了:
然后在 HTTP 服務器日志,可以看到如下答應結果:
可以看到 r.PostForm 返回的也是字典類型數據,數據格式和 r.Form 完全一致,并且這次只包含了 POST 表單請求數據,不包含 URL 查詢字符串,也就是說,通過 r.PostForm 只能獲取 POST 請求數據(請求實體數據),無法獲取 GET 請求數據(查詢字符串中的數據),你可以再次發起 GET 請求進行驗證:
這個時候,可以看到服務器打印日志之包含 id 信息,表單信息為空:
通過 PostForm 獲取具體參數值的方式和 Form 一樣,這里就不再贅述了:
title?:=?r.PostForm.Get("title")content?:=?r.PostForm.Get("content")
實際上,我們在前面的在線論壇項目中,就是通過這個方式獲取表單請求數據的:
err?:=?request.ParseForm()user,?err?:=?models.UserByEmail(request.PostFormValue("email"))
3、FormValue/PostFormValue
最后,還可以通過 FormValue 和 PostFormValue 獲取用戶請求數據,使用它們的好處是不再需要單獨調用 ParseForm 對表單數據進行解析,不過使用這兩個方法的時候只能獲取特定請求數據,不能一次獲取所有請求數據:
func?EditPost(w?http.ResponseWriter,?r?*http.Request)??{????fmt.Println("post?id:",?r.FormValue("id"))
????fmt.Println("post?title:",?r.PostFormValue("title"))
????fmt.Println("post?title:",?r.PostFormValue("content"))
????io.WriteString(w,?"表單提交成功")
}
FormValue/PostFormValue 的區別和 Form/PostForm 一樣,這里通過命名就可以看出來,前者可以獲取所有 GET/POST 請求數據(即查詢字符串和請求實體),后者只能獲取 POST 請求實體數據。
注:FormValue/PostFormValue 之所以不用顯式調用 ParseForm 解析請求數據,是因為底層對其進行了封裝,實際上還是要調用這個方法。
4、獲取 JSON 請求數據
上面的示例默認都是基于 HTML 表單請求,對于客戶端提交的 JSON 格式數據,使用 ParseForm 是無法解析并獲取數據的,因為 HTML 表單請求數據默認是通過 application/x-www-form-urlencoded 編碼的,而 JSON 請求數據通常是通過 application/json 編碼,ParseForm 只能解析通過 application/x-www-form-urlencoded 編碼的數據。
對于 JSON 請求數據的解析,目前我們可以通過上篇教程介紹的,讀取完整請求實體并進行 JSON 解碼實現,下面我們改寫 AddPost 方法實現如下:
type?Post?struct?{????Title?string?`json:"title"`
????Content?string?`json:"content"`
}
func?AddPost(w?http.ResponseWriter,?r?*http.Request)??{
????len?:=?r.ContentLength???//?獲取請求實體長度
????body?:=?make([]byte,?len)??//?創建存放請求實體的字節切片
????r.Body.Read(body)????????//?調用?Read?方法讀取請求實體并將返回內容存放到上面創建的字節切片
????//?io.WriteString(w,?string(body))
????post?:=?Post{}
????json.Unmarshal(body,?&post)??//?對讀取的?JSON?數據進行解析
????fmt.Fprintf(w,?"%#v\n",?post)???//?格式化輸出結果
}
我們將讀取的請求實體數據通過 JSON 解碼映射到 Post 結構體對象并將其輸出到響應結果。
重啟 HTTP 服務器,通過 curl 模擬客戶端提交 JSON 請求數據:
我們通過 -H 選項指定請求數據編碼格式為 application/json,然后請求數據調整為 JSON 格式字符串,最后通過輸出結果可以看到在服務端 JSON 請求數據已經可以成功解析并獲取。
5、小結
到這里,我們已經了解了在 Go Web 編程中,常見的用戶請求數據如何解析并獲取(URL 查詢字符串、POST 表單數據、JSON 請求數據),實際上,和 PHP 中的 $_GET 和 $_POST 類似,Go 也是將 HTTP 請求數據映射到請求對象對應的結構體,然后開發者可以從上下文請求對象中解析并讀取這些請求數據,使用這些封裝好的對象的好處是它們屏蔽了底層的細節,統一了數據格式,可以大大提高開發效率,減少不必要的數據格式兼容成本。
下篇教程,學院君將給大家介紹如何從表單請求中獲取文件數據,并實現簡單的文件上傳功能。
(全文完)
推薦閱讀
Go 語言 Web 編程系列 —— 通過 Request 讀取 HTTP 請求報文
喜歡本文的朋友,歡迎關注“Go語言中文網”:
Go語言中文網啟用微信學習交流群,歡迎加微信:274768166,投稿亦歡迎
總結
以上是生活随笔為你收集整理的怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 iPhone 14 机型如何使用“
- 下一篇: 删除表报正在使用_U盘拔出要不要点quo