日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrameHTTPClient-攔截器/中間件

基本介紹

?HTTPClient?支持強(qiáng)大的攔截器/中間件特性,該特性使得對(duì)于客戶(hù)端的全局請(qǐng)求攔截及注入成為了可能,例如修改/注入提交參數(shù)、修改/注入返回參數(shù)、基于客戶(hù)端的參數(shù)校驗(yàn)等等。中間件的注入通過(guò)以下方法實(shí)現(xiàn):

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的德欽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

func (c *Client) Use(handlers ...HandlerFunc) *Client

在中間件中通過(guò)?Next?方法執(zhí)行下一步流程,?Next?方法定義如下:

func (c *Client) Next(req *http.Request) (*Response, error)

中間件類(lèi)型

?HTTPClient?中間件功能同?HTTPServer?的中間件功能類(lèi)似,同樣也是分為了前置中間件和后置中間件兩種。

前置中間件

處理邏輯位于?Next?方法之前,格式形如:

c := g.Client()
c.Use(func(c *gclient.Client, r *http.Request) (resp *gclient.Response, err error) {
	// 自定義處理邏輯
	return c.Next(r)
})

后置中間件

處理邏輯位于?Next?方法之后,格式形如:

c := g.Client()
c.Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) {
	resp, err = c.Next(r)
    // 自定義處理邏輯
    return resp, err
})

使用示例

我們來(lái)一個(gè)代碼示例更好介紹使用,該示例通過(guò)給客戶(hù)端增加攔截器,對(duì)提交的?JSON?數(shù)據(jù)注入自定義的額外參數(shù),這些額外參數(shù)實(shí)現(xiàn)對(duì)提交參數(shù)的簽名生成體積簽名相關(guān)參數(shù)提交,也就是實(shí)現(xiàn)一版簡(jiǎn)單的接口參數(shù)安全校驗(yàn)。

服務(wù)端

服務(wù)端的邏輯很簡(jiǎn)單,就是把客戶(hù)端提交的?JSON?參數(shù)按照?map?解析后再構(gòu)造成?JSON?字符串返回給客戶(hù)端。

package main

import (
	"github.com/GOgf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	s := g.Server()
	s.Group("/", func(group *ghttp.RouterGroup) {
		group.ALL("/", func(r *ghttp.Request) {
			r.Response.Write(r.GetMap())
		})
	})
	s.SetPort(8199)
	s.Run()
}

客戶(hù)端

客戶(hù)端的邏輯是實(shí)現(xiàn)基本的客戶(hù)端參數(shù)提交、攔截器注入、簽名相關(guān)參數(shù)注入以及簽名參數(shù)生成。

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"

	"github.com/gogf/gf/v2/container/garray"
	"github.com/gogf/gf/v2/crypto/gmd5"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/internal/json"
	"github.com/gogf/gf/v2/net/gclient"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gtime"
	"github.com/gogf/gf/v2/util/gconv"
	"github.com/gogf/gf/v2/util/guid"
	"github.com/gogf/gf/v2/util/gutil"
)

const (
	appId     = "123"
	appSecret = "456"
)

// 注入統(tǒng)一的接口簽名參數(shù)
func injectSignature(jsonContent []byte) []byte {
	var m map[string]interface{}
	_ = json.Unmarshal(jsonContent, &m)
	if len(m) > 0 {
		m["appid"] = appId
		m["nonce"] = guid.S()
		m["timestamp"] = gtime.Timestamp()
		var (
			keyArray   = garray.NewSortedStrArrayFrom(gutil.Keys(m))
			sigContent string
		)
		keyArray.Iterator(func(k int, v string) bool {
			sigContent += v
			sigContent += gconv.String(m[v])
			return true
		})
		m["signature"] = gmd5.MustEncryptString(gmd5.MustEncryptString(sigContent) + appSecret)
		jsonContent, _ = json.Marshal(m)
	}
	return jsonContent
}

func main() {
	c := g.Client()
	c.Use(func(c *gclient.Client, r *http.Request) (resp *gclient.Response, err error) {
		bodyBytes, _ := ioutil.ReadAll(r.Body)
		if len(bodyBytes) > 0 {
			// 注入簽名相關(guān)參數(shù),修改Request原有的提交參數(shù)
			bodyBytes = injectSignature(bodyBytes)
			r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
			r.ContentLength = int64(len(bodyBytes))
		}
		return c.Next(r)
	})
	content := c.ContentJson().PostContent(gctx.New(), "http://127.0.0.1:8199/", g.Map{
		"name": "GoFrame",
		"site": "https://goframe.org",
	})
	fmt.Println(content)
}

運(yùn)行測(cè)試

先運(yùn)行服務(wù)端:

$ go run server.go 

  SERVER  | DOMAIN  | ADDRESS | METHOD | ROUTE |      HANDLER      | MIDDLEWARE  
----------|---------|---------|--------|-------|-------------------|-------------
  default | default | :8199   | ALL    | /     | main.main.func1.1 |             
----------|---------|---------|--------|-------|-------------------|-------------

2021-05-18 09:23:41.865 97906: http server started listening on [:8199]

再運(yùn)行客戶(hù)端:

$ go run client.go 
{"appid":"123","name":"goframe","nonce":"12vd8tx23l6cbfz9k59xehk1002pixfo","signature":"578a90b67bdc63d551d6a18635307ba2","site":"https://goframe.org","timestamp":1621301076}
$ 

可以看到,服務(wù)端接受到的參數(shù)多了多了幾項(xiàng),包括?appid/nonce/timestamp/signature?,這些參數(shù)往往都是簽名校驗(yàn)算法所需要的參數(shù)。


網(wǎng)頁(yè)名稱(chēng):創(chuàng)新互聯(lián)GoFrame教程:GoFrameHTTPClient-攔截器/中間件
鏈接URL:http://www.5511xx.com/article/dhdodjs.html