ここで達成したいのは、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
それは私が作成しているグローバルと何か関係がありますか?