0

compojure-apireturnを使用すると、スキーマを定義できます。

(s/defschema Pizza
  {:name s/Str})

(GET "/pizza/:id" [id]
  :return Pizza
  :summary "returns a Pizza"
  (ok (get-pizza id)))

私の問題は、get-pizzafn が 404 を返すとき、(リクエスタへの) 応答は、 404 がスキーマ{:status 404 :body {:message "Invalid id provided"}}と一致しないということです。Pizza

{
  "errors": {
    "name": "missing-required-key",
    "status": "disallowed-key",
    "body": "disallowed-key"
  }
}

ドキュメントは、複数の応答スキーマを提供できることを示していますが、get-pizzaそれらのスキーマを利用するために fn が何を返す必要があるかは不明です。get-pizza彼らの例では ring-http-response lib を使用して戻り値を生成していますが、私の戻り値 forとring-http-response 'not found' fn の間に違いはありません。

:responses正直なところ、すべてのコードの重複をすでに予測できるため、可能であれば paramを使用したくありません。:returnスキーマを指定する前は、 get-pizzafn で 404 を返してリクエスタに正しく渡すことができましたが、スキーマを追加すると、それができなくなりました。戻り値を一般的に定義されたエラーマップにすることを検討:return (s/one Pizza Error)しましたが、理論上すべての呼び出しが 500 を返す可能性がある場合、すべてのルートに対してErrorこれを行う理由がわかりません。

注: param の使用に切り替えた理由:returnは、生成された swagger-ui ドキュメントがより見やすく、理解しやすくなるためです。

4

1 に答える 1

-1

関数の実装を示していないため、コードに小さな問題があると思いget-pizza [id]ます。

返さ{:status 404 :body {:message "Invalid ID provided}}れたものは、 によって HTTP 200 応答にラップされます(ok (get-pizza id))

見つからget-pizzaない場合、関数はピザまたは nil を返す必要があります。HTTP 応答は、ルートの応答に基づいて生成される必要があります。

(GET "/:id" []
  :path-params [id :- Long]
  :return Pizza
  :summary "Gets a pizza"
  (if-let [pizza (get-pizza id)]
    (ok pizza)
    (not-found {:message "Invalid ID provided"})))

compojure-api リポジトリの元の例nilは、値get-pizzaが空の応答本文で HTTP 200 応答を返すという、少し異なる実装を持っています。あなたの質問によると、代わりに 404 を返し、上記のコードは要件を満たすはずです。

于 2016-02-25T06:37:20.540 に答える