[http] GET 요청을 수행하고 Querystring을 작성하십시오.

나는 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))
}

이 예에서는 api 키를 값으로 사용하여 api_key의 GET 변수가 필요한 URL이 있음을 알 수 있습니다. 문제는 이것이 다음과 같은 형태로 하드 코딩된다는 것입니다.

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

이 쿼리 문자열을 동적으로 빌드하는 방법이 있습니까 ?? 현재 유효한 응답을 얻으려면이 단계 전에 URL을 조합해야합니다.



답변

주석 기 언급했듯이 당신이 얻을 수 Values에서 net/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


답변

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
}


답변

사용하여 NewRequestURL을 생성하는 단지 것은 과잉이다. net/url패키지 사용 :

package main

import (
    "fmt"
    "net/url"
)

func main() {
    base, err := url.Parse("http://www.example.com")
    if err != nil {
        return
    }

    // Path params
    base.Path += "this will get automatically encoded"

    // Query params
    params := url.Values{}
    params.Add("q", "this will get encoded as well")
    base.RawQuery = params.Encode()

    fmt.Printf("Encoded URL is %q\n", base.String())
}

플레이 그라운드 : https://play.golang.org/p/YCTvdluws-r


답변