2017-12-07 39 views
-1

HTTP GETリクエストにクエリパラメータを追加しようとしていますが、SO上に指摘された方法(例:here)が機能しません。HTTP GETリクエストにURLクエリパラメータを追加するにはどうすればよいですか?

Iている次のコード:印刷し

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\n", req.URL) 
    fmt.Printf("RawQuery %+v\n", req.URL.RawQuery) 
    fmt.Printf("Query %+v\n", req.URL.Query()) 
} 

:これを実現する方法について

URL  /callback 
RawQuery 
Query map[] 

任意の提案ですか?

遊び場例:req.URL.Query()ためhttps://play.golang.org/p/SYN4yNbCmo

+0

何か.NewRequest( "GET"、 "/ callback?code = 0xdead 0xbeef"、nil) '? – Adrian

+0

@Adrian私は自分自身でクエリを構築したくなかった - 私はそこに添付する必要がある変数の束を持っている – Patryk

答えて

3

チェックドキュメント:

クエリRawQueryを解析し、対応する値を返します。

それはあなたが得るものの値を「RawQueryとリターンを解析する」ので、そう、そのコピーを修正することは、元のクエリに何もしません、URLのクエリ値の単なるコピーではなく、「ライブ参照」です。元のクエリを変更するには、元のRawQueryに割り当てる必要があります。それは単に、クエリの値を解析し、それらを符号化し、右バックURLにそれらを割り当てるので、これを行うには、あなたのオリジナルの試みがうまくいかなかったことを

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]] 

注: `HTTPと間違っ

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

私は正しさのためにupvoteだろうが、コードだけで解説はあまり役に立たない。これは男に魚を与え、人に魚を教えることではない。 – Adrian

+0

@アドリアンはい、いいですよ。私は私の答えを更新しました。 – maerics

+0

さて、私は頭の中で "RTFM"サインで自分自身を打つべきです。ありがとう! – Patryk

関連する問題