0

ここで達成したいのは、Expects提供されたパラメーターに従って現在のリクエストを実際に検証する、という非常に汎用的なミドルウェアを作成することです。Bad Request必要なパラメーターが存在しないか空の場合は、 aが発生します。Python (Flask) では、これは次のように非常に単純です。

@app.route('/endpoint', methods=['POST'])
@expects(['param1', 'param2'])
def endpoint_handler():
    return 'Hello World'

の定義は次のexpectsようになります (非常に最小限の例)。

def expects(fields):
    def decorator(view_function):

        @wraps(view_function)
        def wrapper(*args, **kwargs):
            # get current request data
            data = request.get_json(silent=True) or {}          

            for f in fields:
                if f not in data.keys():
                    raise Exception("Bad Request")

            return view_function(*args, **kwargs)

        return wrapper
    return decorator

Goでそれをどのように達成するかについて、私は少し混乱しています。私がこれまでに試したことは次のとおりです。

type RequestParam interface {
    Validate() (bool, error)
}

type EndpointParamsRequired struct {
    SomeParam string `json:"some_param"`
}

func (p *EndpointParamsRequired) Validate() {
    // My validation logic goes here
    if len(p.SomeParam) == 0 {
        return false, "Missing field"
    }
}

func Expects(p RequestParam, h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // Check if present in JSON request

        // Unmarshall JSON
        ...

        if _, err := p.Validate(); err != nil {
            w.WriteHeader(http.StatusBadRequest)
            fmt.Fprintf(w, "Bad request: %s", err)

            return
        }
    }
}

そしてmain.goファイルから:

func main() {
    var (
        endopintParams EndpointParamsRequired
    )

    r.HandleFunc("/endpoint", Expects(&endopintParams, EndpointHandler)).Methods("POST")

}

実際に初めて機能し、リクエストを検証しますが、1 つの有効なリクエストの後、json に必要なパラメーターが含まれていなくても、連続するすべてのリクエストが成功します。endopintParamsそれは私が作成しているグローバルと何か関係がありますか?

4

0 に答える 0