【问题标题】:URL Builder/Query builder in GoGo 中的 URL 构建器/查询构建器
【发布时间】:2014-11-18 00:16:35
【问题描述】:

我有兴趣通过浏览器或 CLI 动态获取用户的参数作为输入,以将这些参数传递给 REST API 调用,从而使用 Go 动态构建 URL,最终将获取一些 JSON 数据。

我想知道 Go 中的一些技术可以帮助我做到这一点。我认为的一种理想方法是使用映射并使用参数键和相应的值填充它,然后对其进行迭代并将其附加到 URL 字符串中。但是当涉及到动态获取参数和填充地图时,我不太确定如何在 Go 中做到这一点。有人可以帮我写一些 Go 中的代码 sn-p 吗?

请求示例:

http://<IP>:port?api=fetchJsonData&arg1=val1&arg2=val2&arg3=val3.....&argn=valn

【问题讨论】:

    标签: rest url go


    【解决方案1】:

    已经有url.URL 为您处理这类事情。

    对于 http 处理程序(传入请求),它是 http.Request 的一部分(使用 req.URL.Query() 访问它)。

    来自官方docs的一个很好的例子:

    u, err := url.Parse("http://bing.com/search?q=dotnet")
    if err != nil {
        log.Fatal(err)
    }
    u.Scheme = "https"
    u.Host = "google.com"
    q := u.Query()
    q.Set("q", "golang")
    u.RawQuery = q.Encode()
    fmt.Println(u)
    

    【讨论】:

    • 这是一个不错的方法。谢谢。您能否建议一种方法,我可以将键值对存储在地图中,然后使用该地图构造 URL?
    • @psbits url.Values 是一个映射(你可以从 u.Query() 得到一个副本),你可以用它来构造 URL 然后使用u := url.Parse("http://base.com/"); u.RawQuery = yourValues.Encode(); URL := u.String()
    • 好的,谢谢。我做了这样的事情 - { urlMap := make(map[string]string) urlMap["arg1"] = "val1" urlMap["arg2"] = "val2" url.Scheme = "http" url.Host = ip + ":" + defaultPort q := url.Query() for k, _ := range urlMap { q.Set(k, urlMap[k]) } url.RawQuery = q.Encode() fmt.Println(url) }
    • @psbits你不用,url.Values定义为type Values map[string][]string,直接用就可以了。
    • 我喜欢文档示例的厚颜无耻:)
    【解决方案2】:

    https://github.com/golang/go/issues/17340#issuecomment-251537687

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

    package main
    
    import (
        "fmt"
        "net/url"
    )
    
    func someURL() string {
        url := url.URL{
            Scheme: "https",
            Host:   "example.com",
        }
        return url.String()
    }
    
    func main() {
        fmt.Println(someURL())
    }
    

    返回:

    https://example.com

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多