如何在HTTP GET请求中添加URL查询参数?

我正在尝试向HTTP GET请求中添加查询参数,但是在某种程度上指出了SO上的方法(例如此处)无效。</ p> \ n

我有以下代码段:</ p>

  package main 

import(
“ fmt”
“ log”
“ net / http“

func main(){
req,err:= http.NewRequest(” GET“,” / callback“,nil)
req.URL.Query()。Add(” code“ ,“ 0xdead 0xbeef”)
req.URL.Query()。Set(“ code”,“ 0xdead 0xbeef”)
//这无济于事
//req.URL.RawQuery = req.URL。 Query()。Encode()

,如果错误!= nil {
log.Fatal(err)
}

fmt.Printf(“ URL%+ v
”,req.URL)\ n fmt.Printf(“ RawQuery%+ v
”,req.URL.RawQuery)
fmt.Printf(“ Query%+ v
”,req.URL.Query())
}
</ 代码> </ pre>

打印以下内容:</ p>

  URL / callback 
RawQuery
查询地图[]
</ code> </ pre>

任何建议 如何实现此目标?</ p>

操场上的例子: https:// play.golang.org/p/SYN4yNbCmo </ p>
</ div>

展开原文

原文

I am trying to add a query parameter to a HTTP GET request but somehow methods pointed out on SO (e.g. here) don't work.

I have the following piece of code:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    req, err := http.NewRequest("GET", "/callback", nil)
    req.URL.Query().Add("code", "0xdead 0xbeef")
    req.URL.Query().Set("code", "0xdead 0xbeef")
    // this doesn't help
    //req.URL.RawQuery = req.URL.Query().Encode()

    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("URL      %+v
", req.URL)
    fmt.Printf("RawQuery %+v
", req.URL.RawQuery)
    fmt.Printf("Query    %+v
", req.URL.Query())
}

which prints:

URL      /callback
RawQuery 
Query    map[]

Any suggestions on how to achieve this?

Playground example: https://play.golang.org/p/SYN4yNbCmo

doulianglou0898
doulianglou0898 我不想自己建立查询-我有一堆需要附加的变量
2 年多之前 回复
dth42345
dth42345 http.NewRequest(“GET”,“/callback?code=0xdead0xbeef”,nil)有问题吗?
2 年多之前 回复

1个回答



检查文档中的 req.URL.Query()</ code> :</ p>


Query解析RawQuery并返回相应的值。 </ p>
</ blockquote>

因为它“解析RawQuery并返回”值,所以您获得的只是URL查询值的副本,而不是“实时引用”,因此进行修改 复制对原始查询没有任何作用。 为了修改原始查询,您必须分配给原始 RawQuery </ code>。</ p>

  q:= req.URL.Query()//获取一个 查询值的副本。
q.Add(“ code”,“ 0xdead 0xbeef”)//将新值添加到集合中。
req.URL.RawQuery = q.Encode()//编码并分配回 原始查询。

// URL / callback?code = 0xdead + 0xbeef
// RawQuery代码= 0xdead + 0xbeef
//查询映射[code:[0xdead 0xbeef]]
</ code> </ pre>

请注意,您最初的尝试没有用,因为它只是解析查询值,对它们进行编码,然后将其分配回URL:</ p>

< pre> req.URL.RawQuery = req.URL.Query()。Encode()
//这基本上是一个小问题!
</ code> </ pre>
</ div>

展开原文

原文

Check the docs for req.URL.Query():

Query parses RawQuery and returns the corresponding values.

Since it "parses RawQuery and returns" the values what you get is just a copy of the URL query values, not a "live reference", so modifying that copy does nothing to the original query. In order to modify the original query you must assign to the original RawQuery.

q := req.URL.Query() // Get a copy of the query values.
q.Add("code", "0xdead 0xbeef") // Add a new value to the set.
req.URL.RawQuery = q.Encode() // Encode and assign back to the original query.

// URL      /callback?code=0xdead+0xbeef
// RawQuery code=0xdead+0xbeef
// Query    map[code:[0xdead 0xbeef]]

Note that your original attempt to do so didn't work because it simply parses the query values, encodes them, and assigns them right back to the URL:

req.URL.RawQuery = req.URL.Query().Encode()
// This is basically a noop!

duanqizao6492
duanqizao6492 好吧,我应该打个“ RTFM”标志。 谢谢!
2 年多之前 回复
doucang2831
doucang2831 是的,打个好电话。 我已经更新了答案。
2 年多之前 回复
dpvr49226
dpvr49226 我会为正确性投票,但是仅提供代码却没有解释的答案只会有很大帮助。 这是在给男人一条鱼,而不是在教男人钓鱼。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问