go

Go:如何修改URL查询参数

2022-05-13  本文已影响0人  Go语言由浅入深

本文我们将讨论如何用Go对URL参数进行添加、修改或删除。用一个例子来说明,看看怎么能将以下URL:

https://example.com?name=alice&age=28&gender=female

转变为:

https://example.com?name=alice&age=29&occupation=carpenter

如果你想改变URL查询字符串:

func main() {
    //使用url.Parse()函数将字符串解析成*url.URL类型。
    //如果URL已经是url.URL类型可以跳过这一步。
    urlA, err := url.Parse("https://example.com?name=alice&age=28&gender=female")
    if err != nil {
        log.Fatal(err)
    }

    //使用Query()方法获取URL中的查询字符串参数,存在map类型中。
    values := urlA.Query()

    //使用Add(), Set(), Del()方法来修改返回查询参数, 本质上就是对map的修改
    //可以使用Get(), Has()方法来查询或检查是否包含对应参数
    values.Add("occupation", "carpenter")
    values.Del("gender")
    values.Set("age", strconv.Itoa(29))


    //使用Encode()方法将map转为URL格式的字符串(类似"age=29&name=alice...")
    //然后将新的查询参数赋值到URL对象的查询参数字段
    urlA.RawQuery = values.Encode()

    fmt.Printf("urlA: %s", urlA.String())
}

上面的代码执行结果为:

urlA: https://example.com?age=29&name=alice&occupation=carpenter

如果你希望使用不同的查询参数来克隆一个新URL,同时保持原来的URL不变的话,你需要拷贝一份原来的url.URL结构体。有好几种方法来实现。

方法1:

url0, _ := url.Parse("[https://hey.com/?was=true](https://hey.com/?was=true)")
url1, _ := url.Parse(uri0.String())

url1是url0的一份深度拷贝。

方法2:

urlA, _ :=url.Parse("https://example.comname=alice&age=28&gender=female")
newUrl := urlA
fmt.Println(&urlA, &newUrl)

执行结果会发现两个地址不一样的,这样你就创建了一个新的url.URL变量,内容和原来的url相同。
将前面的代码合并起来,就可以使用不同的查询参数创建一个新的URL:

urlA, err := url.Parse("https://example.com?name=alice&age=28&gender=female")
if err != nil {
    log.Fatal(err)
}

// 拷贝原url.URL.
urlB := *urlA

// 对新url.URL类型进行参数更改…
values := urlB.Query()

values.Add("occupation", "carpenter")
values.Del("gender")
values.Set("age", strconv.Itoa(29))

urlB.RawQuery = values.Encode()

fmt.Printf("urlA: %s\n", urlA.String()) // This will be unchanged.
fmt.Printf("urlB: %s\n", urlB.String()) // This will have the new params.

执行结果:

urlA: https://example.com?name=alice&age=28&gender=female
urlB: https://example.com?age=29&name=alice&occupation=carpenter

顺便说一下,你可以在任何时候使用这项技术来“克隆”一个URL并对其进行修改。例如,创建一个不同路径的URL,你可以这样做:

urlA, err := url.Parse("https://example.com/foo")
if err != nil {
    log.Fatal(err)
}

urlB := *urlA

urlB.Path = "/bar"

fmt.Printf("%s\n", urlA.String()) // Prints https://example.com/foo
fmt.Printf("%s\n", urlB.String()) // Prints https://example.com/bar
上一篇 下一篇

猜你喜欢

热点阅读