第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

GoLang - 使用正文數(shù)據(jù)跟蹤 POST 請(qǐng)求的重定向

GoLang - 使用正文數(shù)據(jù)跟蹤 POST 請(qǐng)求的重定向

Go
ITMISS 2022-10-24 09:11:41
我想在 POST 請(qǐng)求中使用相同的正文進(jìn)行重定向。來(lái)自 GO 來(lái)源 (client.go)func redirectBehavior(reqMethod string, resp *Response, ireq *Request) (redirectMethod string, shouldRedirect, includeBody bool) {    switch resp.StatusCode {    case 301, 302, 303:        redirectMethod = reqMethod        shouldRedirect = true        includeBody = false        // RFC 2616 allowed automatic redirection only with GET and        // HEAD requests. RFC 7231 lifts this restriction, but we still        // restrict other methods to GET to maintain compatibility.        // See Issue 18570.但有時(shí)服務(wù)器會(huì)為 POST 請(qǐng)求返回 302 Redirect,這意味著我需要將相同的正文發(fā)送到另一個(gè)位置。在這種情況下我該怎么辦?func FollowRedirectForPost() {    client := &http.Client{}        req, _ := http.NewRequest(http.MethodPost, "example.com/test", strings.NewReader(url.Values{        "key": {"value"},        "key1":{"value1"},    }.Encode()))    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")    client.Do(req) // If server returns 302 Redirect so it means I need make the same request with the same body to    // a different location. Just imagine i replaced "example.com/test" to "example.com/redirect_url"}
查看完整描述

2 回答

?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊

來(lái)自RFC7231

服務(wù)器應(yīng)該在包含不同 URI 的 URI 引用的響應(yīng)中生成 Location 頭字段。用戶(hù)代理可以使用 Location 字段值進(jìn)行自動(dòng)重定向。服務(wù)器的響應(yīng)負(fù)載通常包含一個(gè)簡(jiǎn)短的超文本注釋?zhuān)渲邪赶虿煌?URI 的超鏈接。

注意:由于歷史原因,用戶(hù)代理可以將后續(xù)請(qǐng)求的請(qǐng)求方法從 POST 更改為 GET。如果不希望出現(xiàn)這種行為,則可以改用 307(臨時(shí)重定向)狀態(tài)代碼。

所以你可以跟隨重定向,新的 URI 在Location標(biāo)頭中。你不必。您可以將方法更改為 GET,但不必這樣做。所以本質(zhì)上,你所做的任何事情都是符合 RFC 的。

CheckRedirect您可以通過(guò)提供函數(shù)來(lái)提供自己的重定向策略。基本上與客戶(hù)在is和was時(shí)redirectPostOn302所做的相同:includeBodytrueredirectMethodPOST

func FollowRedirectForPost() {

    client := &http.Client{

        CheckRedirect: redirectPostOn302,

    }

    

    req, _ := http.NewRequest(http.MethodPost, "example.com/test", strings.NewReader(url.Values{

        "key": {"value"},

        "key1":{"value1"},

    }.Encode()))


    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

    client.Do(req) // If server returns 302 Redirect so it means I need make the same request with the same body to

    // a different location. Just imagine i replaced "example.com/test" to "example.com/redirect_url"

}


func redirectPostOn302(req *http.Request, via []*http.Request) error {

    if len(via) >= 10 {

        return errors.New("stopped after 10 redirects")

    }


    lastReq := via[len(via)-1]

    if req.Response.StatusCode == 302 && lastReq.Method == http.MethodPost {

        req.Method = http.MethodPost


        // Get the body of the original request, set here, since req.Body will be nil if a 302 was returned

        if via[0].GetBody != nil {

            var err error

            req.Body, err = via[0].GetBody()

            if err != nil {

                return err

            }

            req.ContentLength = via[0].ContentLength

        }

    }


    return nil

}


查看完整回答
反對(duì) 回復(fù) 2022-10-24
?
瀟瀟雨雨

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊

最佳做法是更改服務(wù)器狀態(tài)代碼 - 307(臨時(shí)重定向)或 308(永久重定向)。

如果服務(wù)器回復(fù)重定向,則客戶(hù)端首先使用 CheckRedirect 函數(shù)來(lái)確定是否應(yīng)遵循重定向。如果允許,301、302 或 303 重定向會(huì)導(dǎo)致后續(xù)請(qǐng)求使用 HTTP 方法 GET(如果原始請(qǐng)求是 HEAD,則使用 HEAD),沒(méi)有正文。如果定義了 Request.GetBody 函數(shù),307 或 308 重定向會(huì)保留原始 HTTP 方法和正文。NewRequest 函數(shù)自動(dòng)為通用標(biāo)準(zhǔn)庫(kù)主體類(lèi)型設(shè)置 GetBody。

另一種超級(jí) hacky 方式可能是 - 更改 CheckRedirect 函數(shù)中的請(qǐng)求 https://github.com/golang/go/blob/master/src/net/http/client.go#L78 https://github.com/golang/去/blob/master/src/net/http/client.go#L691

// example hack

 func FollowRedirectForPost(data io.Reader) {

    client := &http.Client{

        CheckRedirect: func(req *Request, via []*Request) error {

            // check status code etc.

            req.Method = http.MethodPost

            req.Body = data

        }

    }

    

    req, _ := http.NewRequest(http.MethodPost, "example.com/test", data)


    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

    client.Do(req) // If server returns 302 Redirect so it means I need make the same request with the same body to

    // a different location. Just imagine i replaced "example.com/test" to "example.com/redirect_url"

}


查看完整回答
反對(duì) 回復(fù) 2022-10-24
  • 2 回答
  • 0 關(guān)注
  • 239 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)