IT/Go

[Go/Golang] echo 프레임워크를 이용해 Parameter 받는 방법(Query Param, Path Val)

wookiist 2021. 3. 3. 16:43

echo 프레임워크를 이용해 Parameter 받는 방법(Query Param, Path Val)

URI를 이용해서 인자를 전달하는 방법은 여러 가지가 있습니다. 가장 대중적으로 사용하는 Query ParameterPath Variable에 대해 정리해보겠습니다.

Query Parameter

입력

http://localhost:8080/users/?name=wookii&age=27

위와 같이 Query Parameter의 형태로 전달받은 데이터는 echo.Context.QueryParam() 메서드나 echo.Context.QueryParams() 메서드로 처리할 수 있습니다.

소스 코드 1

type users struct {
    name string
    age  int
}

func queryParamHandler(c echo.Context) error {
    name := c.QueryParam("name")
    age, err := strconv.Atoi(c.QueryParam("age"))
    if err != nil {
        return err
    }
    return c.JSONPretty(http.StatusOK, users{name: name, age: age}, "  ")
}

func queryParamsHandler(c echo.Context) error {
    qParams := c.QueryParams()
    name := qParams["name"][0]
    age, err := strconv.Atoi(qParams["age"][0])
    if err != nil {
        return err
    }
    return c.JSONPretty(http.StatusOK, users{name: name, age: age}, "  ")
}    

두 방식은 큰 차이가 없습니다. 원하는 메서드를 사용하면 됩니다.

다만, Query Parameter에 age라는 인자가 optional이면 이야기가 달라집니다. 첫번째 방식의 경우에는 age가 반드시 있어야 합니다. 그렇지 않으면 에러가 발생합니다. 두번째 방식도 마찬가지로 에러가 발생하지만, 코드를 일부 수정하면 에러를 막을 수 있습니다. 다음과 같이 바꿔봅니다.

소스 코드 2

func queryParamsHandler(c echo.Context) error {
    var name string
    var age int
    qParams := c.QueryParams()
    if val, ok := qParams["name"]; ok {
        name = val[0]
    }
    if val, ok := qParams["age"]; ok {
        age, err = strconv.Atoi(val[0])
        if err != nil {
            return err
        }
    }
    return c.JSONPretty(http.StatusOK, users{name: name, age: age}, "  ")
}    

위의 코드처럼 수정하면 인자가 없는 경우에도 정상적으로 동작하게 됩니다.

Path Variable

입력

http://localhost:8080/users/name/wookii/age/27

Path Variable로 받은 인자는 echo.Context.Param() , echo.Context.ParamNames() , echo.Context.ParamValues() 로 처리할 수 있습니다.

Param()

Path Variable로 받은 인자 중, input으로 받은 인자를 리턴합니다.

ParamNames()

Path Variable로 받은 인자들의 Path Parameter 이름의 Slice를 리턴합니다.

ParamValues()

Path Variable로 받은 인자들의 실제 값의 Slice를 리턴합니다.

소스 코드 1

func pathParamHandler(c echo.Context) error {
    name := c.Param("name")
    age, err := strconv.Atoi(c.Param("age"))
    if err != nil {
        return err
    }
    return c.JSONPretty(http.StatusOK, users{name: name, age: age}, "  ")
}
반응형