developer tip

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

copycodes 2021. 1. 9. 10:14
반응형

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

참조 URL : https://stackoverflow.com/questions/30652577/go-doing-a-get-request-and-building-the-querystring

반응형