无法在 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 请求的主要内容,如果未能解决你的问题,请参考以下文章

中构造函数的参数 0 需要一个无法找到的 类型的 bean

PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)

PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)

form表单的GET和POST请求

网络编程 利用NSURLSession发送GET POST请求

OkHttpOkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )