无法在 Go 中构造 HTTP GET 请求
Posted
技术标签:
【中文标题】无法在 Go 中构造 HTTP GET 请求【英文标题】:Failing to construct an HTTP GET request in Go 【发布时间】:2021-12-16 05:10:39 【问题描述】:我能够让 HTTP GET 请求像这样工作:
resp, err := http.Get("https://services.nvd.nist.gov/rest/json/cves/1.0/?modStartDate=2021-10-29T12%3A00%3A00%3A000%20UTC-00%3A00&modEndDate=2021-10-30T00%3A00%3A00%3A000%20UTC-00%3A00&resultsPerPage=5000")
我想有一种更简单的方法来构造查询参数,所以我创建了这个:
req, err := http.NewRequest("GET", "https://services.nvd.nist.gov/rest/json/cves/1.0/", nil)
if err != nil
fmt.Printf("Error: %v\n", err)
os.Exit(1)
q := req.URL.Query()
q.Set("modStartDate", "2021-10-29T12:00:00:000 UTC-00:00")
q.Set("modEndDate", "2021-10-30T00:00:000 UTC-00:00")
q.Set("resultsPerPage", "5000")
req.URL.RawQuery = q.Encode()
client := http.Client
resp, err := client.Do(req)
响应状态是 404。我不清楚我缺少什么。我在第二个中缺少的第一个 GET 请求是什么?
作为参考,我正在使用的 API: https://nvd.nist.gov/developers/vulnerabilities
【问题讨论】:
我们使用 q.Add() 代替 q.Set()。这对你有用吗? @jcfollower:更改为q.Set()
时仍然得到404
@JimB:手动编码版本有效,我得到了预期的数据。时间里没有多余的:00
。
哦,它们的格式是yyyy-MM-dd'T'HH:mm:ss:SSS
,所以你在第二个版本中缺少了一个时间字段(实际上阅读错误信息在这里有帮助)
【参考方案1】:
正如@JimB 所说,将您的原始原始查询与您的生成查询进行比较显示了格式问题:
origURL := "https://services.nvd.nist.gov/rest/json/cves/1.0/?modStartDate=2021-10-29T12%3A00%3A00%3A000%20UTC-00%3A00&modEndDate=2021-10-30T00%3A00%3A00%3A000%20UTC-00%3A00&resultsPerPage=5000"
u, _ := url.Parse(origURL)
q, _ := url.ParseQuery(u.RawQuery)
q2 := url.Values
q2.Set("modStartDate", "2021-10-29T12:00:00:000 UTC-00:00")
q2.Set("modEndDate", "2021-10-30T00:00:000 UTC-00:00")
q2.Set("resultsPerPage", "5000")
fmt.Println(q) // map[modEndDate:[2021-10-30T00:00:00:000 UTC-00:00] modStartDate:[2021-10-29T12:00:00:000 UTC-00:00] resultsPerPage:[5000]]
fmt.Println(q2) // map[modEndDate:[2021-10-30T00:00:000 UTC-00:00] modStartDate:[2021-10-29T12:00:00:000 UTC-00:00] resultsPerPage:[5000]]
https://play.golang.org/p/36RNIb7Micu
所以将额外的:00
添加到您的时间格式中:
q.Set("modStartDate", "2021-10-29T12:00:00:00:000 UTC-00:00")
q.Set("modEndDate", "2021-10-30T00:00:00:000 UTC-00:00")
【讨论】:
以上是关于无法在 Go 中构造 HTTP GET 请求的主要内容,如果未能解决你的问题,请参考以下文章
PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)
PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)