使用 url.URL 初始化后者时设置请求的上下文
Posted
技术标签:
【中文标题】使用 url.URL 初始化后者时设置请求的上下文【英文标题】:Set context to request when the later is initialised with a url.URL 【发布时间】:2021-10-14 19:34:41 【问题描述】:我想创建一个net/url.URL
,然后在http.Client
和http.Request
构造中使用它,如下所示
client := http.Client
Timeout: 5 * time.Second,
req := http.Request
URL: someKindOf_url.URL_type_I_have_already_initialised_elsewhere,
resp, err := client.Do(&req)
在req
构造时,我想传递一个(已经存在的)context.Context
Request
type好像没有这个字段。
有这个NewRequestWithContext
工厂function,但使用字符串作为URL
而不是net/url.URL
有没有办法解决这个问题?
【问题讨论】:
【参考方案1】:您永远不应该使用文字创建 http.Request
对象。始终使用构造函数NewRequest
或NewRequestWithContext
。构造函数does a lot more 比简单地为结构分配简单的值。
考虑到这一点,实现目标的正确方法是,例如:
req := http.NewRequestWithContext(ctx, http.MethodGet, someKindOf_url.String(), nil)
也就是说,您可以为现有请求分配上下文:
req = req.WithContext(ctx)
【讨论】:
问题是我的net/url.URL
有其他信息,我正在尝试弄清楚如何将其传递给请求url: &url.URL Scheme: "https", Host: host, User: url.UserPassword(username, password), ,
我告诉过你怎么做:url.String()
。我不确定你还想要什么。毕竟,URL 只是 一个字符串(尽管具有特定的语义含义)。 URL 的任何部分都不能表示为字符串。
这也将通过url.UserPassword
字段中的基本身份验证?
是的。这是 URL 的一部分。【参考方案2】:
http.Request
没有公共上下文字段,但有私有。
你可以做的是使用http.Request
的WithContext(ctx context.Context)
方法
【讨论】:
以上是关于使用 url.URL 初始化后者时设置请求的上下文的主要内容,如果未能解决你的问题,请参考以下文章