<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **設置路由** 分別使用GET、POST、PUT、PATCH、DELETE和OPTIONS訪問方式 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { // 注冊一個默認的路由器 router := gin.Default() // 最基本的用法 router.GET("/appGet", func(c *gin.Context) { // 回復一個200OK,在client的http-get的resp的body中獲取數據 c.String(http.StatusOK, "appGet OK") }) router.POST("/appPost", func(c *gin.Context) { // 回復一個200 OK, 在client的http-post的resp的body中獲取數據 c.String(http.StatusOK, "appPost OK") }) router.PUT("/appPut", func(c *gin.Context) {}) router.DELETE("/appDelete", func(c *gin.Context) {}) router.PATCH("/appPatch", func(c *gin.Context) {}) router.HEAD("/appHead", func(c *gin.Context) {}) router.OPTIONS("/appOptions", func(c *gin.Context) {}) // router.Run() // 不傳參數,默認是8080端口 // 綁定端口是 8000 ,注意是要加:" router.Run(":8000") } ~~~ 編譯運行 Get方式請求:http://0.0.0.0:8000/appGet 返回:appGet OK Post方式請求:http://0.0.0.0:8000/appPost 返回:appPost OK **帶參數的路由** 1)使用gin.Context中的Param方法解析 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) // 處理帶參數的path-GET func getParameter(c *gin.Context) { // 回復一個200 OK,獲取傳入的參數 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "參數:%s %s get parameter OK", nickname, passwd) } // 處理帶參數的path-POST func postParameter(c *gin.Context) { // 回復一個200 OK,獲取傳入的參數 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "參數:%s %s post parameter OK", nickname, passwd) } // 注意':'和'*'的區別 func optionalParameter(c *gin.Context) { // 回復一個200 OK,獲取傳入的參數 nickname := c.Param("nickname") passwd := c.Param("passwd") c.String(http.StatusOK, "參數:%s %s optional parameter OK", nickname, passwd) } func main() { router := gin.Default() // 注意':'必須要匹配,'*'選擇匹配,即存在就匹配,否則可以不考慮 router.GET("/appGet/:nickname/:passwd", getParameter) router.POST("/appPost/:nickname/:passwd", postParameter) router.GET("/optional/:nickname/*passwd", optionalParameter) router.Run(":8000") } ~~~ 注意:定義參數的方法有兩個輔助符號':'和'*'。 如果使用':'參數方法,那么這個參數是必須要匹配的。 如果使用'*'參數, 那么這個參數是可選的。 編譯運行 Get方式請求:http://0.0.0.0:8000/appGet/nickname=oldboy/passwd=123456 返回:參數:nickname=oldboy passwd=123456 get parameter OK Post方式請求:http://0.0.0.0:8000/appPost/nickname=oldboy/passwd=123456 返回:參數:nickname=oldboy passwd=123456 post parameter OK 可選參數: Get方式請求:http://0.0.0.0:8000/optional/nickname=oldboy/passwd=123456 返回:參數:nickname=oldboy /passwd=123456 optional parameter OK http://0.0.0.0:8000/optional/nickname=oldboy/ 返回:參數:nickname=oldboy / optional parameter OK 2)使用gin.Context中的Query方法解析,類似于正常的URL中的參數傳遞 ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) // 使用Query獲取參數 func getParameter(c *gin.Context) { // 回復一個200 OK,獲取傳入的參數 nickname := c.Query("nickname") passwd := c.Query("passwd") c.String(http.StatusOK, "參數:%s %s get parameter OK", nickname, passwd) } // 使用Query獲取參數 func postParameter(c *gin.Context) { // 回復一個200 OK,獲取傳入的參數 nickname := c.Query("nickname") passwd := c.Query("passwd") c.String(http.StatusOK, "參數:%s %s post parameter OK", nickname, passwd) } func main() { router := gin.Default() // 使用gin的Query參數形式 router.GET("/appGet", getParameter) router.POST("/appPost", postParameter) router.Run(":8000") } ~~~ 編譯運行 Get方式請求:http://0.0.0.0:8000/appGet?nickname=oldboy&passwd=123456 返回:參數:oldboy 123456 get parameter OK Post方式請求:http://0.0.0.0:8000/appPost?nickname=oldboy&passwd=123456 返回:參數:oldboy 123456 post parameter OK 3)使用gin.Context中的PostForm方法解析 我們需要將參數放在請求的Body中傳遞, 而不是URL中 ~~~ package main import "github.com/gin-gonic/gin" // 參數是form中獲得,即從Body中獲得,忽略URL中的參數 func postParameter(c *gin.Context) { message := c.PostForm("message") extra := c.PostForm("extra") nick := c.DefaultPostForm("nick", "anonymous") c.JSON(200, gin.H{ "status": "postParameter:posted", "message": message, "nick": nick, "extra": extra, }) } func main() { router := gin.Default() // 使用post_form形式,注意必須要設置Post的type, // 同時此方法中忽略URL中帶的參數,所有的參數需要從Body中獲得 router.POST("/appPost", postParameter) router.Run(":8000") } ~~~ 由于我們使用了request Body,那么就需要指定Body中數據的形式,此處是form格式,即application/x-www-form-urlencoded。常見的幾種http提交數據方式有: application/x-www-form-urlencoded; multipart/form-data; application/json; text/xml。具體使用請google. 在服務端, 使用message := c.PostForm("message")方法解析參數,然后進行處理。 客戶端請求代碼: ~~~ package main import ( "fmt" "io/ioutil" "net/http" "strings" ) var resp *http.Response func main() { // 使用post_form形式,注意必須要設置Post的type,同時此方法中忽略URL中帶的參數,所有的參數需要從Body中獲得 resp, _ = http.Post("http://0.0.0.0:8000/appPost", "application/x-www-form-urlencoded", strings.NewReader("message=hello&extra=world")) helpRead(resp) } // 用于讀取resp的body func helpRead(resp *http.Response) { defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("ERROR2!: ", err) } fmt.Println(string(body)) } ~~~ 獲取請求頭信息 ~~~ ua := c.GetHeader("User-Agent") ct := c.GetHeader("Content-Type") ~~~ 設置請求頭信息 ~~~ ua := c.Header("User-Agent","Mozilla/5.0") ct := c.Header("Content-Type","text/html; charset=utf-8") ~~~ **路由分組** ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // g1 g1 := router.Group("/g1") { g1.GET("/login", func(c *gin.Context) { c.String(http.StatusOK, "/g1/login OK") }) g1.GET("/submit", func(c *gin.Context) {}) g1.GET("/read", func(c *gin.Context) {}) } // g2 g2 := router.Group("/g2") { g2.POST("/login", func(c *gin.Context) { c.String(http.StatusOK, "/g2/login OK") }) g2.POST("/submit", func(c *gin.Context) {}) g2.POST("/read", func(c *gin.Context) {}) } router.Run(":8000") } ~~~ 編譯運行 Get方式請求:http://0.0.0.0:8000/g1/login 返回:/g1/login OK Post方式請求:http://0.0.0.0:8000/g2/login 返回:/g2/login OK **middleware中間件** 注意,gin.Default() 默認是加載了一些框架內置的中間件的,而 gin.New() 則沒有,根據需要自己手動加載中間件。 ~~~ package main import ( "fmt" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.New() r.Use(gin.Logger()) r.Use(gin.Recovery()) // 在單個路由中使用 MyBenchLogger 中間件 r.GET("/benchmark", MyBenchLogger(), func(c *gin.Context) {}) authorized := r.Group("/") // 在路由組中使用中間件 authorized.Use(func(c *gin.Context) {}) { authorized.POST("/login", func(c *gin.Context) { c.String(http.StatusOK, "/login OK") }) authorized.POST("/submit", func(c *gin.Context) {}) authorized.POST("/read", func(c *gin.Context) {}) // testing group testing := authorized.Group("testing") testing.GET("/analytics", func(c *gin.Context) { c.String(http.StatusOK, "/testing/analytics OK") }) } // Listen and serve on 0.0.0.0:8080 r.Run(":8000") } // 中間件示例 func MyBenchLogger() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("before middleware") c.Set("request", "clinet_request") c.Next() fmt.Println("before middleware") } } ~~~ 編譯運行 Get方式請求:http://0.0.0.0:8000/testing/analytics 返回:/testing/analytics OK Post方式請求:http://0.0.0.0:8000/login 返回:/login OK **靜態文件服務** 可以向客戶端展示本地的一些文件信息, 例如顯示某路徑下地文件。服務端代碼示例: ~~~ package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() // 下面測試靜態文件服務 // 顯示當前文件夾下的所有文件/或者指定文件 router.StaticFS("/showDir", http.Dir(".")) // router.StaticFS("/files", http.Dir("/bin")) router.Static("/files", "/bin") router.StaticFile("/image", "./oldboy/1.jpg") router.Run(":8000") } ~~~ 首先你需要在服務器的路徑下創建一個oldboy文件夾,并且放入1.jpg文件。如果已經存在請忽略。 在瀏覽器中輸入: 0.0.0.0:8000/showDir 頁面返回:服務器當前路徑下地文件信息 在瀏覽器中輸入: 0.0.0.0:8000/files 頁面返回:服務器/bin目錄下地文件信息 在瀏覽器中輸入: 0.0.0.0:8000/image 頁面返回:服務器./oldboy/1.jpg圖片
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看