使用 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.Clienthttp.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

Requesttype好像没有这个字段。

有这个NewRequestWithContext 工厂function,但使用字符串作为URL 而不是net/url.URL

有没有办法解决这个问题?

【问题讨论】:

【参考方案1】:

您永远不应该使用文字创建 http.Request 对象。始终使用构造函数NewRequestNewRequestWithContext。构造函数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.RequestWithContext(ctx context.Context)方法

【讨论】:

以上是关于使用 url.URL 初始化后者时设置请求的上下文的主要内容,如果未能解决你的问题,请参考以下文章

PHP中使用cURL实现Get和Post请求的方法

python 如何获取url信息

2019-09-16 curl简单操作

上传图片到cdn服务器

在使用通量架构完成 ajax 请求后更新 reactjs 上下文

jquery ajax 返回 文件 类型要怎么设置