go-resty / resty

Simple HTTP and REST client library for Go
MIT License
9.89k stars 696 forks source link

Setting context for all request? #722

Open renom opened 11 months ago

renom commented 11 months ago

Add client.SetContext similar to client.SetHeader (Client method)

jeevatkm commented 11 months ago

@renom Could you explain your request in detail along with some samples, please? I need more confidence about using the same instance of Context in all the requests.

jeevatkm commented 10 months ago

@renom Any feedback?

renom commented 10 months ago

@jeevatkm thanks for the response. I thought about initializing the client once when multiple requests are sent further in the same code block. Or setting the context when the client is passed to another service as a func argument, to avoid passing the context separately. If you still need code examples, I can make them a little bit later.

renom commented 10 months ago

Case 1 (now):

func DoSomething(ctx context.Context, url1, url2, url3 string) (err error) {
    client := resty.New()
    _, err = client.R().SetContext(ctx).Get(url1)
    if err != nil {
        return err
    }
    _, err = client.R().SetContext(ctx).Get(url2)
    if err != nil {
        return err
    }
    _, err = client.R().SetContext(ctx).Get(url3)
    if err != nil {
        return err
    }
    return nil
}

Case 1 (updated):

func DoSomething(ctx context.Context, url1, url2, url3 string) (err error) {
    client := resty.New().SetContext(ctx)
    _, err = client.R().Get(url1)
    if err != nil {
        return err
    }
    _, err = client.R().Get(url2)
    if err != nil {
        return err
    }
    _, err = client.R().Get(url3)
    if err != nil {
        return err
    }
    return nil
}
renom commented 10 months ago

Case 2 (now):

func DoSomething(client *resty.Client, ctx context.Context, url1, url2, url3 string) (err error) {
    _, err = client.R().SetContext(ctx).Get(url1)
    if err != nil {
        return err
    }
    _, err = client.R().SetContext(ctx).Get(url2)
    if err != nil {
        return err
    }
    _, err = client.R().SetContext(ctx).Get(url3)
    if err != nil {
        return err
    }
    return nil
}

Case 2 (updated):

func DoSomething(client *resty.Client, url1, url2, url3 string) (err error) {
    _, err = client.R().Get(url1)
    if err != nil {
        return err
    }
    _, err = client.R().Get(url2)
    if err != nil {
        return err
    }
    _, err = client.R().Get(url3)
    if err != nil {
        return err
    }
    return nil
}

We can still pass the context:

err := DoSomething(client.SetContext(ctx), url1, url2, url3)
jeevatkm commented 6 months ago

@renom Thank you for the code snippets to explain the use case flow.