設計一個 web 小應用,展現靜態文件服務、js 請求支持、模板輸出、表單處理、Filter 中間件設計等方面的能力。(不須要數據庫支持)
編程 web 應用程序 cloudgo-io。 請在項目 README.MD 給出完成任務的證據! 實現內容 1) 支持靜態文件服務 2) 支持簡單 js 訪問 3) 提交表單,並輸出一個表格 4) 對 /unknown 給出開發中的提示,返回碼 5xx
此次我實現的是一個基於Gin框架開發的Web服務程序,基礎的網頁前端是以前上Web 2.0課程中登錄界面的做業代碼。具體來講是一個支持用戶註冊和信息查看的網頁。用戶能夠登陸並查看他們的信息,而後能夠經過網址欄跳轉到相應網頁進行查看。作了一些關於用戶信息的重複判斷和一些魯棒性方面的東西。前端
首先上一張預覽圖,讓你們看看效果:golang
Gin是一個golang的微框架,封裝比較優雅,API友好,源碼註釋比較明確,已經發布了1.0版本。具備快速靈活,容錯方便等特色。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也很是不錯。框架更像是一些經常使用函數或者工具的集合。藉助框架開發,不只能夠省去不少經常使用的封裝帶來的時間,也有助於團隊的編碼風格和造成規範web
下面爲了讓你們可以對Gin有更好的認識和基本的上手,這裏介紹一下使用Gin實現的Hello,World。數據庫
import ( "gopkg.in/gin-gonic/gin.v1" "net/http" ) func main(){ router := gin.Default() router.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "Hello World") }) router.Run(":8000") }
簡單幾行代碼,就能實現一個web服務。使用gin的Default方法建立一個路由handler。而後經過HTTP方法綁定路由規則和路由函數。不一樣於net/http庫的路由函數,gin進行了封裝,把request和response都封裝到gin.Context的上下文環境。最後是啓動路由的Run方法監聽端口。麻雀雖小,五臟俱全。固然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等經常使用的restful方法。編程
在Gin中,搭建靜態文件服務是比較容易的一件事情,下面貼一段代碼:restful
func main() { router := gin.Default() router.Static("/assets", "./assets") // Listen and server on 0.0.0.0:8080 router.Run(":8080") }
上面這段代碼,爲路由器指定了一個Static Route,全部指向assets的訪問,都會去./assets這個目錄下面進行查找框架
當客戶端試圖經過用POST方法向服務端發送請求的時候,它其實是向服務端發送了一個POST方法的表單數據。由於,咱們處理POST方法其實是處理了一個表單數據,gin框架在這方面有也完備的作法:函數
// 這裏建立的這個type是用來綁定數據並傳送去服務端的 type registerJSON struct { Username string `form:"username" binding:"required"` Stuid string `form:"stuid" binding:"required"` Tel string `form:"tel" binding:"required"` Email string `form:"email" binding:"required"` } // 建立一個type的實例用於綁定數據 var user registerJSON // 試圖綁定由客戶端發送的數據 if err := c.Bind(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "code": "BAD_REQUEST", "message": "Something wrong with the server", }) fmt.Println(err.Error()) return }
在上面的示例代碼中,咱們爲其分配了表單中的字段,從而使它能夠去解析一個 POST 表單。進而進行進一步的邏輯處理。經過 Bind 方法,咱們就能將請求中的數據悉數傳入到給定的綁定實例上,而若是有任何問題發生,一個 err 將會被返回給你。工具
/unknown實現也不是一個很難實現的東西,用一些基本的語法就能夠實現了:性能
router.GET("/unknown", func(c *gin.Context) { c.JSON(http.StatusNotImplemented, gin.H{ "code": "NOT_IMPLEMENTED", "message": "This page has not been implemented.", }) })
所謂的404問題,也就是找不到對應的page嘛,Gin框架裏面有一個NoRoute方法,它能夠捕獲到全部未能經過Route方法指定處理函數的請求,而且爲這些未處理的請求統一分配函數。
router.NoRoute(func(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{ "code": "PAGE_NOT_FOUND", "message": "Target page not found.", }) })