如何在golang中解析/创建动态URL

时间:2017-10-16 12:49:02

标签: go

我正在尝试创建一个可以生成网址的buildURL函数。但是,当遇到动态网址时,我遇到了一个问题。

type ShopifyDownloader struct {
    Domain      string
    AccessToken string
}

func (sd *ShopifyDownloader) BuildURL(Path string, Query map[string]string) (string, error) {
    u, err := url.Parse("https://123.myshopify.com/admin/orders/count.json?access_token=123")
    if err != nil {
        fmt.Println("Cannot parse", err)
        return "", err
    }
    u.Host = sd.Domain
    u.Path = Path
    params := url.Values{}
    for key, value := range Query {
        params.Add(key, value)
    }
    u.RawQuery = params.Encode()
    nu := u.String()
    var buffer bytes.Buffer
    buffer.WriteString(nu)
    buffer.WriteString("?access_token=")
    buffer.WriteString(sd.AccessToken)
    bu := buffer.String()
    return bu, err
}

它需要域,令牌,路径和查询,并在字符串中生成一个URL。但它不适用于动态路径(带id) 这个/admin/orders/#{id}.json或者这个/admin/products/#{id}/images/#{id}.json 有没有人有任何建议?

1 个答案:

答案 0 :(得分:0)

为什么不在您使用它的地方构建一个更简单的网址?

url := fmt.Sprintf("%s/admin/orders/count.json?access_token=%s&custom=%s",sd.Domain,sd.Token,customparam)

然后使用它。这具有完全清楚意图和在每种情况下使用的URL同时共享重要内容(shopify域等)的优点。那么关于id的问题就变得容易了:

url := fmt.Sprintf("%s/admin/orders/%d.json?access_token=%s",sd.Domain,orderID,sd.Token)

url := fmt.Sprintf("%s/admin/products/%d/images/%d.json?access_token=%s",sd.Domain,productID,imageID,sd.Token)

如果你认为你的参数超级复杂(对我而言,这必须至少为5),只需将它们放入url.Values(包括令牌):

params := url.Values{"myparam":{"123"}, "token": {sd.Token}}
url := fmt.Sprintf("%s/admin/orders/count.json?%s", sd.Domain, 
params.Encode())

但是如果你有大量的参数,这是值得的。

如果要向ShopifyDownloader添加函数,为什么要强制调用者定义url结构?尽量让它们更简单。您不需要解析URL或写入字节缓冲区,http.Get需要一个字符串,因此使用字符串。如果你想构建函数,可以考虑使用知道url格式的单独函数,将它从调用者中抽象出来,所以:

 func (sd *ShopifyDownloader) OrderURL(orderID int, params url.Values) string {
        params["token"] = []string{sd.AccessToken}
        return fmt.Sprintf("%s/admin/orders/%d.json?%s",sd.Domain,orderID,params)
    }

调用者不应该知道Shopify网址的具体格式,这可能会改变(就像端点可能会改变一样)。