去做一个GET请求并构建Querystring

时间:2015-06-04 19:32:15

标签: http go

我是Go的新手,并不是很了解一切。在许多现代语言Node.js,Angular,jQuery,PHP中,您可以使用其他查询字符串参数执行GET请求。

在Go中执行此操作并非如此简单,我现在还无法解决这个问题。我真的不想为我想要做的每个请求连接一个字符串。

以下是示例脚本:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    client := &http.Client{}

    req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    req.Header.Add("Accept", "application/json")
    resp, err := client.Do(req)

    if err != nil {
        fmt.Println("Errored when sending request to the server")
        return
    }

    defer resp.Body.Close()
    resp_body, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(resp.Status)
    fmt.Println(string(resp_body))
}

在这个例子中,你可以看到有一个URL,它需要一个api_key的GET变量,你的api键作为值。问题在于它变成了以下形式的硬编码:

req, _ := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular?api_key=mySuperAwesomeApiKey", nil)

有没有办法动态构建这个查询字符串?目前,我需要在此步骤之前汇总URL,以获得有效的响应。

3 个答案:

答案 0 :(得分:135)

作为评论者提及,您可以Valuesnet/url获得Encode方法。您可以执行以下操作(req.URL.Query()返回现有的url.Values

package main

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

func main() {
    req, err := http.NewRequest("GET", "http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")
    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popular?another_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

http://play.golang.org/p/L5XCrw9VIG

答案 1 :(得分:17)

当您附加到现有查询时使用r.URL.Query(),如果要构建新的参数集,请使用url.Values结构,如此

package main

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

func main() {
    req, err := http.NewRequest("GET","http://api.themoviedb.org/3/tv/popular", nil)
    if err != nil {
        log.Print(err)
        os.Exit(1)
    }

    // if you appending to existing query this works fine 
    q := req.URL.Query()
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    // or you can create new url.Values struct and encode that like so
    q := url.Values{}
    q.Add("api_key", "key_from_environment_or_flag")
    q.Add("another_thing", "foo & bar")

    req.URL.RawQuery = q.Encode()

    fmt.Println(req.URL.String())
    // Output:
    // http://api.themoviedb.org/3/tv/popularanother_thing=foo+%26+bar&api_key=key_from_environment_or_flag
}

答案 2 :(得分:0)

仅使用for(int k = -N+1; k <= N-1; k++) { int i = N-1 - Math.abs(k); for(int j = N; J > N-i; j--){ System.out.print(j); } for(int j = 0; J < 2*(N-i)-1; j++){ System.out.print(N-i); } for(int j = N-i+1; J <= N; j++){ System.out.print(j); } System.out.println(); } 来创建URL是过大的。使用NewRequest包:

net/url

游乐场:https://play.golang.org/p/YCTvdluws-r