Add query string url in Go

huangapple go评论135阅读模式
英文:

Add query string url in Go

问题

我需要将HTTP请求发送到https://some-domain.com/getsomething/?id=myID。我有URL并且需要向其添加查询参数。以下是我的Go代码:

  1. baseUrl := "https://some-domain.com"
  2. relativeUrl := "/getsomething/"
  3. url, _ := url.Parse(baseUrl)
  4. url.Path = path.Join(url.Path, relativeUrl)
  5. // 添加参数到查询字符串
  6. queryString := url.Query()
  7. queryString.Set("id", "1")
  8. // 将查询字符串添加到URL
  9. url.RawQuery = queryString.Encode()
  10. // 打印URL
  11. fmt.Println(url.String())

输出结果是这个URL:https://some-domain.com/getsomething?id=1

而我需要的是这个URL:https://some-domain.com/getsomething/?id=1

你可以看到在?之前没有/字符。

你知道如何在不进行手动字符串操作的情况下修复它吗?

https://play.golang.org/p/HsiTzHcvlQ

英文:

I need to send http request to https://some-domain.com/getsomething/?id=myID
I have url and need to add to it a query parameter. Here is my Go code

  1. baseUrl := "https://some-domain.com"
  2. relativeUrl := "/getsomething/"
  3. url, _ := url.Parse(baseUrl)
  4. url.Path = path.Join(url.Path, relativeUrl)
  5. // add parameter to query string
  6. queryString := url.Query()
  7. queryString.Set("id", "1")
  8. // add query to url
  9. url.RawQuery = queryString.Encode()
  10. // print it
  11. fmt.Println(url.String())

In output I see this url: https://some-domain.com/getsomething?id=1

And this one is required: https://some-domain.com/getsomething/?id=1

You can see that there is no / character before ?.

Do you know how to fix it without manual string manipulations?

https://play.golang.org/p/HsiTzHcvlQ

答案1

得分: 10

你可以使用ResolveReference方法。

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/url"
  6. )
  7. func main() {
  8. relativeUrl := "/getsomething/"
  9. u, err := url.Parse(relativeUrl)
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. queryString := u.Query()
  14. queryString.Set("id", "1")
  15. u.RawQuery = queryString.Encode()
  16. baseUrl := "https://some-domain.com"
  17. base, err := url.Parse(baseUrl)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. fmt.Println(base.ResolveReference(u))
  22. }
英文:

You can use ResolveReference.

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/url"
  6. )
  7. func main() {
  8. relativeUrl := "/getsomething/"
  9. u, err := url.Parse(relativeUrl)
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. queryString := u.Query()
  14. queryString.Set("id", "1")
  15. u.RawQuery = queryString.Encode()
  16. baseUrl := "https://some-domain.com"
  17. base, err := url.Parse(baseUrl)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. fmt.Println(base.ResolveReference(u))
  22. }

https://play.golang.org/p/BIU29R_XBM

huangapple
  • 本文由 发表于 2017年9月13日 18:43:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/46195423.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定