Go의 http 패키지에서 POST 요청에 대한 쿼리 문자열을 어떻게 얻습니까?


114

httpPOST 요청을 처리하기 위해 Go 의 패키지를 사용하고 있습니다. Request객체 에서 쿼리 문자열의 내용에 액세스하고 구문 분석하려면 어떻게 해야합니까? 공식 문서에서 답을 찾을 수 없습니다.


명심해야 할 한 가지는 cURL을 사용하여 요청을 보내고 r.FormValue("id")쿼리 매개 변수를 가져 오는 데 사용 하는 경우 cURL의 양식 데이터를 통해 i를 보낼 수 없습니다 (즉, curl 0.0.0.0:8888 -d id=foobar작동하지 않음). 쿼리 매개 변수 ( curl 0.0.0.0:8888?id=foobar) 를 통해 전송해야합니다 .

답변:


145

QueryString은 정의 에 따라 URL에 있습니다. req.URL( doc )를 사용하여 요청의 URL에 액세스 할 수 있습니다 . URL 객체에는 단순히 QueryString 매개 변수 중 하나 인 유형 을 반환 하는 Query()메서드 ( doc )가 있습니다.Valuesmap[string][]string

찾고있는 것이 HTML 양식에 의해 제출 된 POST 데이터 인 경우 이는 일반적으로 요청 본문의 키-값 쌍입니다. 전화를 걸고 필드를 ParseForm()사용 req.Form하여 키-값 쌍의 맵을 가져올 수 있다는 대답이 정확 하지만 FormValue(key)특정 키의 값을 가져 오기 위해 호출 할 수도 있습니다 . ParseForm()필요한 경우 호출 하고 전송 된 방법 (예 : 쿼리 문자열 또는 요청 본문)에 관계없이 값을 가져옵니다.


2
정확성에 감사드립니다.
Fabien 2013 년

2
'req.FormValue (key)'메소드가 더 빠르며 URL을 사전 구문 분석하는 데 필요한 모든 코드를 수행합니다.
OnlyAngel 2014 년

6
req.URL.RawQuery?도움이된다면 GET 요청 후 모든 것을 반환합니다 .
kouton

req.formValue ( "some_field")가 한 번에 호출되지 않는 한 흥미로운 req.Form이 빈 배열이라는 것을 알았습니다.
Qian Chen

정말 감사합니다! @kouton
디트 야 바르 마

127

다음은 GET 매개 변수에 액세스하는 방법에 대한보다 구체적인 예입니다. Request객체는 호출을 위해 그들을 파싱하는 방법이 있습니다 쿼리 :

http : // host : port / something? param1 = b 와 같은 요청 URL 가정

func newHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println("GET params were:", r.URL.Query())

  // if only one expected
  param1 := r.URL.Query().Get("param1")
  if param1 != "" {
    // ... process it, will be the first (only) if multiple were given
    // note: if they pass in like ?param1=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=something
  param1s := r.URL.Query()["param1"]
  if len(param1s) > 0 {
    // ... process them ... or you could just iterate over them without a check
    // this way you can also tell if they passed in the parameter as the empty string
    // it will be an element of the array that is the empty string
  }    
}

또한 "값 맵 [즉, Query () 반환 값]의 키는 대소 문자를 구분합니다."


4
이전의 대답은 이미 언급하고 그냥 일을 워드 프로세서에 연결 (원하는 필드가 존재하지 않는 경우는 경계의 밖으로 당황 것입니다 예를 들어이없는이 사용 참조 슬라이스 r.URL.Query().Get("moviename")이 치명적인 실수를 피하기 위해).
Dave C

1
정보 주셔서 감사합니다. 그래, 문서는 나에게 약간 혼란스러워서 유용한 경우를 대비하여 "예제에 손을 대는 것"으로 게시했습니다. nil 검사를 수정했습니다. 이 Get메서드를 사용하면 여러 개가있는 경우 첫 번째 만 반환되므로 이것이 더 많은 예입니다. 유용한 정보, 감사합니다!
rogerdpack 2015 년

또한 당신이 전무에 문자열 비교 수 있다고 생각하지 않습니다 : devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang 즉, 문자열 = ""유효!
제임스 밀너

나는 코드가 컴파일 될 것이라고 생각하지 않는다. Values.Get()반환 되는 빈 문자열을 nil. golang.org/pkg/net/url/#Values
Daniel Farrell

19

다음은 예입니다.

value := r.FormValue("field")

더 많은 정보를 위해서. http 패키지에 대한 자세한 내용은 여기에서 설명서를 참조하십시오 . FormValue기본적으로 POST 또는 PUT 값 또는 GET 값을 첫 번째로 찾은 순서대로 반환합니다.


8

다음은 간단하고 작동하는 예입니다.

package main

import (
    "io"
    "net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "name: "+req.FormValue("name"))
    io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}

func main() {
    http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
        queryParamDisplayHandler(res, req)
    })
    println("Enter this in your browser:  http://localhost:8080/example?name=jenny&phone=867-5309")
    http.ListenAndServe(":8080", nil)
}

여기에 이미지 설명 입력



5

아래 단어는 공식 문서에서 가져온 것입니다.

양식에는 URL 필드의 쿼리 매개 변수POST 또는 PUT 양식 데이터를 포함하여 파싱 된 양식 데이터가 포함 됩니다 . 이 필드는 ParseForm이 호출 된 후에 만 ​​사용할 수 있습니다.

따라서 아래와 같은 샘플 코드가 작동합니다.

func parseRequest(req *http.Request) error {
    var err error

    if err = req.ParseForm(); err != nil {
        log.Error("Error parsing form: %s", err)
        return err
    }

    _ = req.Form.Get("xxx")

    return nil
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.