GO http 2일차 - Query String 사용하기

0

GO http

목록 보기
2/5

Request Query String

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.HandlerFuncRequest 객체로부터 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.RequestURL.Query() 메서드를 이용하면 되는데, Has를 사용하면 있는 지 없는 지를 확인하는 것이고, Get을 사용하면 값을 가져오는 것이다. Get의 반환값은 문자열이기 때문에 굳이 Has로 확인하지 않아도 값이 없다면 빈 문자열이 반환된다.

단, 빈 문자열이 특정한 의미를 갖는 경우는 Has로 확인하는 것이 좋다.

가령, 클라이언트가 filter기능을 사용하는데 서버가 빈 문자열을 받았다고 하자. 이것은 무슨 의미일까?? '필터링할 것이 없으니 모두 보여줘' 또는 '필터링 기능 자체를 사용하지 않았으니 검색하지 말아줘' 둘 중 하나의 의미일 것이다. 이를 구분하기 위해서는 Has로 구분하여 Has로 필터링이 있지만 빈 문자열이면 검색을 했다는 것이고 모든 결과를 보여주면 된다. 반면, Hasfalse라면 검색하지 말아줘이므로 결과를 보여주지 않아도 된다.

이제 코드를 실행하고 다음의 url을 요청해보자.

http://localhost:8888/go?first=name&second=age

브라우저를 사용해도 되고, curl을 사용해도 된다.

first:true name, second:true age

이런 결과를 얻게 될 것이다.

사용하기 매우 간편하다.

0개의 댓글