上一講我們介紹了如何寫(xiě)讓模板變量在頁(yè)面上展示,本講我們介紹一下后端開(kāi)發(fā)工作中最常用的功能——接口。創(chuàng)建一個(gè)go_test4文件夾,然后把go_test3中的代碼復(fù)制進(jìn)去。然后打開(kāi)main.go文件,進(jìn)行更改。
說(shuō)到接口就必不可少的涉及到傳值和接口返回,還有GET方式 、POST方式獲取數(shù)據(jù)。下面我們就先舉例來(lái)看看一個(gè)GET接口如何接收參數(shù)并且返回?cái)?shù)據(jù),具體代碼如下:
package main
import "github.com/gin-gonic/gin"
import "net/http"
func main() {
? ? r:= gin.Default()
? ? r.GET("/index", func(c *gin.Context) {
? ? ? ? firstname := c.Query("firstname")
? ? ? ? lastname := c.Query("lastname");
? ? ? ? c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
? ? })
? ? r.Run(":9999") // listen and serve on 0.0.0.0:9999
}
代碼前半部分還是跟第七講中一樣,我們只需要關(guān)注?c.Query 和?c.String這兩個(gè)差異點(diǎn)就可以了。c.Query方法相當(dāng)于Nodejs請(qǐng)求下圖代碼中的paramStr=url.parse(req.url).query;這一行代碼。
var http=require('http'),url=require('url'),
querystring=require('querystring');
http.createServer(function(req,res{
paramStr=url.parse(req.url).query;
)}
就是在url中查找Key為firstname的字段,然后把value 返回給firstname。lastname也是的獲取方式也是一樣的。
至于c.String本身跟c.HTML還是有一些差異的。c.String有三個(gè)參數(shù),第一個(gè)是請(qǐng)求返回的Code碼,這個(gè)參數(shù)直接http.StatusOK就可以。第二個(gè)參數(shù)是返回字符串原型,第三個(gè)是需要替換的字符串變量。
c.HTML也有三個(gè)參數(shù),第一個(gè)也是請(qǐng)求返回的Code碼,第二個(gè)是渲染HTML的模板地址(可以是html也就是不能設(shè)置模板變量的,也可以是tmpl可以設(shè)置模板變量的),最后一個(gè)是就是需要展示的模板變量名。
具體函數(shù)先介紹到這里,后面我們看一下運(yùn)行代碼之后的訪問(wèn)界面。
訪問(wèn):http://localhost:9999/index?firstname=%22Chen1%22&lastname=%22Chen2%22
可以看到下圖,我們?cè)谠L問(wèn)頁(yè)面請(qǐng)求時(shí)加入了firtname和lastname參數(shù)。然后在通過(guò)Gin的router獲取到了參數(shù)。最終把參數(shù)拼接為Hello "Chen1" "Chen2"字符串,返回給前端頁(yè)面。

另外,在服務(wù)器控制臺(tái)我們也能看到用戶(hù)攜帶的對(duì)應(yīng)參數(shù)信息,這部分信息不是我們打印的,而是Gin自動(dòng)會(huì)在控制臺(tái)拼接出訪問(wèn)用戶(hù)的PATH,如下圖所示。

我們已經(jīng)講過(guò)了GET請(qǐng)求的方式返回?cái)?shù)據(jù),以及獲取URL中的參數(shù)。
接下來(lái)我們?cè)撏瓿闪硪粋€(gè)在平時(shí)開(kāi)發(fā)中常用的接口形式——POST方法傳遞數(shù)據(jù)。
接下來(lái)我們把main.go文件改為下面的代碼。
package main
import (
? ? "fmt"
? ? "net/http"
? ? "github.com/gin-gonic/gin"
)
func main() {
? ? r := gin.Default()
? ? r.POST("/post", func(c *gin.Context) {
? ? ? ? name := c.PostForm("name")? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? password := c.DefaultPostForm("password", "00000000")
? ? ? ? result, ok := c.GetPostForm("ok")? ? ? ? ? ? ? ??
? ? ? ? fmt.Println(ok)
? ? ? ? c.String(http.StatusOK, "hello %s %s %s", name, password, result)
? ? })
? ? r.Run(":9999") // listen and serve on 0.0.0.0:9999
}
然后執(zhí)行g(shù)o run main.go。
然后開(kāi)啟postman,發(fā)POST送一個(gè)請(qǐng)求,并且設(shè)置對(duì)應(yīng)的參數(shù)name參數(shù)為aaaa,對(duì)應(yīng)的password參數(shù)為password,對(duì)應(yīng)的ok參數(shù)為ok。發(fā)送postman請(qǐng)求看看返回如下圖所示。

? c.String(http.StatusOK, "hello %s %s %s", name, password, result)方法中,我們請(qǐng)求的參數(shù)都已經(jīng)返回??梢源蠹矣^察到還有一個(gè)fmt.Println(ok)沒(méi)有輸出。fmt.Println(ok)要在控制臺(tái)中觀察。如下圖所示:

下面我們就對(duì)在后端中獲取Gin中POST的參數(shù)的三個(gè)常用方法做一下介紹。
PostForm獲取POST參數(shù),如果沒(méi)有獲取到對(duì)應(yīng)key的返回值,觸發(fā)零值機(jī)制,返回空字符串
DefaultPostForm獲取POST參數(shù),如果沒(méi)有獲取到返回key的返回值,返回設(shè)置的默認(rèn)值,也就是DefaultPostForm函數(shù)的第二個(gè)參數(shù)。
GetPostForm獲取post參數(shù),但是有兩個(gè)返回值,第一個(gè)返回值表示返回結(jié)果,如果沒(méi)有獲取對(duì)應(yīng)key的返回值時(shí),同樣出發(fā)零值機(jī)制,返回空字符串。第二個(gè)返回值會(huì)返回當(dāng)時(shí)key值是否存在的狀態(tài),能獲取到返回true,如果不能獲取到返回false。
到此最常用的兩種獲取數(shù)據(jù)方式就介紹到這里了,有了他們其實(shí)我們就可以應(yīng)對(duì)大部分的業(yè)務(wù)邏輯接口。
陳辰(CC老師)? ? 978563552@qq.com