Исходя из вашего вопроса, я думаю, что это вам уже ясно, но на всякий случай: Сессии не запускаются на клиенте, они запускаются на сервере. Сервер проверяет, существует ли указанный 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
все вместе.