Как создать HTTP-сессию в Go - PullRequest
0 голосов
/ 06 февраля 2020

В настоящее время я использую fasthttp для отправки своих запросов. Мой вопрос: есть ли возможность иметь постоянный сеанс? Мне нужны файлы cookie и данные, чтобы прикрепить.

c := fasthttp.Client{ Name: "Add To Cart",}

store, err := session.Start() // ?????
args := fasthttp.AcquireArgs()
defer fasthttp.ReleaseArgs(args)

args.Add("pid", sizepid)
args.Add("options", "[]")
args.Add("quantity", "1")

statusCode, body, err := c.Post(nil, "URL", args)
if err != nil {
    panic(err)
}`

1 Ответ

1 голос
/ 06 февраля 2020

Исходя из вашего вопроса, я думаю, что это вам уже ясно, но на всякий случай: Сессии не запускаются на клиенте, они запускаются на сервере. Сервер проверяет, существует ли указанный c cook ie; если это так, он возобновляет сеанс, который идентифицирует повар ie; если это не так, он создает новый сеанс и отправляет идентификатор обратно клиенту как повар ie. Все, что нужно сделать клиенту, - это отправить на сервер правильный повар ie.

Итак, вам нужно читать и писать файлы cookie. Интерфейс fasthttp.Client.Post() не позволяет вам этого делать. Таким образом, вместо этого приятного интерфейса все становится довольно уродливым.

Вам нужно запросить fasthttp для обоих объектов Request и Response, прежде чем выполнять запрос. После того, как вы выполнили первоначальный запрос, вам нужно либо просмотреть все файлы cookie, либо прочитать указанный c cook ie. Теперь вы можете использовать эти значения для вашего следующего запроса.

Я написал короткий пример того, как вы это сделаете.

func main() {
    c := fasthttp.Client{}

    // Create a request
    req := fasthttp.AcquireRequest()
    defer fasthttp.ReleaseRequest(req)
    req.SetRequestURI(`https://www.google.com/`)

    // Create a response
    resp := fasthttp.AcquireResponse()
    defer fasthttp.ReleaseResponse(resp)

    // Execute the request, writing to the response object
    err := c.Do(req, resp)
    if err != nil {
        panic(err)
    }

    //  Loop over all cookies; usefull if you want to just send everything back on consecutive requests
    resp.Header.VisitAllCookie(func(key, value []byte) {
        log.Printf("Cookie %s: %s\n", key, value)
    })

    // Read a specific cookie
    nid := fasthttp.AcquireCookie()
    defer fasthttp.ReleaseCookie(nid)
    nid.SetKey(`NID`)
    if resp.Header.Cookie(nid) {
        log.Println("Value for NID Cookie: " + string(nid.Value()))

        // Create a second request and set the cookie from the first
        req2 := fasthttp.AcquireRequest()
        defer fasthttp.ReleaseRequest(req2)
        req2.SetRequestURI(`https://www.google.com/`)
        req2.Header.SetCookie(`NID`, string(nid.Value()))

        // Now you can execute this request again using c.Do() - don't forget to acquire a new Response!
    }
}

Примечание: вы можете решили пропустить шаги fasthttp.AcquireXXX() и defer fasthttp.ReleaseXXX(yyy) - но это сведет на нет многие (возможно, большинство) выигрыши в производительности по сравнению с использованием стандартного net/http, поэтому, если вы go, этот маршрут может просто отбросить fasthttp все вместе.

...