Skip to content

Session & Cookies Examples

Using Session

Session maintains cookies across multiple requests:

go
package main

import (
	"fmt"
	"github.com/go-zoox/fetch"
)

func main() {
	// Create a session
	session := fetch.Session()
	session.SetBaseURL("https://httpbin.zcorky.com")

	// First request - login (sets cookie)
	loginResp, err := session.Post("/cookies/set", &fetch.Config{
		Body: map[string]interface{}{
			"session": "abc123",
		},
	}).Execute()
	if err != nil {
		panic(err)
	}

	// Subsequent requests will use cookies from login
	response, err := session.Get("/cookies").Execute()
	if err != nil {
		panic(err)
	}

	fmt.Println(response.JSON())
}

Setting Cookies Manually

go
f := fetch.New()
f.SetCookie("session", "abc123")
f.SetCookie("user_id", "42")

response, err := f.Get("https://httpbin.zcorky.com/cookies").Execute()

Getting Cookies from Response

go
response, err := fetch.Get("https://httpbin.zcorky.com/cookies/set?name=value")
if err != nil {
	panic(err)
}

// Get Set-Cookie header
setCookie := response.SetCookie()
fmt.Println("Set-Cookie:", setCookie)

Session with Multiple Requests

go
func main() {
	session := fetch.Session()
	session.SetBaseURL("https://api.example.com")

	// Login
	loginResp, err := session.Post("/login", &fetch.Config{
		Body: map[string]interface{}{
			"username": "user",
			"password": "pass",
		},
	}).Execute()
	
	if err != nil || !loginResp.Ok() {
		panic("Login failed")
	}

	// Protected request 1 - cookies are automatically included
	usersResp, err := session.Get("/users").Execute()
	
	// Protected request 2 - same session, same cookies
	profileResp, err := session.Get("/profile").Execute()
	
	fmt.Println(usersResp.JSON())
	fmt.Println(profileResp.JSON())
}
go
package main

import (
	"fmt"
	"github.com/go-zoox/fetch"
)

type Client struct {
	session *fetch.Fetch
}

func NewClient(baseURL string) *Client {
	return &Client{
		session: fetch.Session().SetBaseURL(baseURL),
	}
}

func (c *Client) Login(username, password string) error {
	response, err := c.session.Post("/login", &fetch.Config{
		Body: map[string]interface{}{
			"username": username,
			"password": password,
		},
	}).Execute()
	
	if err != nil {
		return err
	}
	
	if !response.Ok() {
		return fmt.Errorf("login failed: %v", response.Error())
	}
	
	return nil
}

func (c *Client) GetUsers() (*fetch.Response, error) {
	return c.session.Get("/users").Execute()
}

func main() {
	client := NewClient("https://api.example.com")
	
	if err := client.Login("user", "pass"); err != nil {
		panic(err)
	}
	
	response, err := client.GetUsers()
	if err != nil {
		panic(err)
	}
	
	fmt.Println(response.JSON())
}