query string은 url의 부분에 ?
로 시작하고, 두 개 이상을 쓰고 싶다면 &
로 나열할 수 있다. 이를 통해 request
를 보내면 server
에게 client가 원하는 값을 전송할 수 있다. 단, url
에 query string이 노출됨으로 노출되도 문제가 없는 정보만 사용하는 것이 좋다.
query string은 http server에게서 filter, custom 결과를 받기를 원할 떄 많이 사용된다. 가령, 클라이언트에게 보여줄 페이지 개수로, 하나의 서버가 results
값을 query string
으로 받는다면 ?results=10
이런식으로 전송하여 http server는 10개의 results 결과만 전송할 수 있다.
go
에서는 http.HandlerFunc
의 Request
객체로부터 query string
을 얻을 수 있다. 다음의 예제를 확인해보자.
...
func goHandler(res http.ResponseWriter, req *http.Request) {
hasFirst := req.URL.Query().Has("first")
first := req.URL.Query().Get("first")
haSecond := req.URL.Query().Has("second")
second := req.URL.Query().Get("second")
result := fmt.Sprintf("first:%v %s, second:%v %s", hasFirst, first, haSecond/, second)
io.WriteString(res, result)
}
func main() {
fmt.Println("start server!")
mux := http.NewServeMux()
mux.HandleFunc("/", HelloHandler)
mux.HandleFunc("/go", goHandler)
err := http.ListenAndServe(":8888", mux)
...
}
다음의 goHandler
핸들러는 query string
으로 first, second
를 받고 있다. 이를 받기위해는 http.Request
의 URL.Query()
메서드를 이용하면 되는데, Has
를 사용하면 있는 지 없는 지를 확인하는 것이고, Get
을 사용하면 값을 가져오는 것이다. Get
의 반환값은 문자열이기 때문에 굳이 Has
로 확인하지 않아도 값이 없다면 빈 문자열이 반환된다.
단, 빈 문자열이 특정한 의미를 갖는 경우는 Has
로 확인하는 것이 좋다.
가령, 클라이언트가 filter
기능을 사용하는데 서버가 빈 문자열을 받았다고 하자. 이것은 무슨 의미일까?? '필터링할 것이 없으니 모두 보여줘' 또는 '필터링 기능 자체를 사용하지 않았으니 검색하지 말아줘' 둘 중 하나의 의미일 것이다. 이를 구분하기 위해서는 Has
로 구분하여 Has
로 필터링이 있지만 빈 문자열이면 검색을 했다는 것이고 모든 결과를 보여주면 된다. 반면, Has
가 false
라면 검색하지 말아줘이므로 결과를 보여주지 않아도 된다.
이제 코드를 실행하고 다음의 url
을 요청해보자.
http://localhost:8888/go?first=name&second=age
브라우저를 사용해도 되고, curl
을 사용해도 된다.
first:true name, second:true age
이런 결과를 얻게 될 것이다.
사용하기 매우 간편하다.