2

Grape を使用して API を定義する場合、パラメータの存在とタイプを検証する非常に便利な方法があります。次に例を示します。

params do
    requires :param1, type: String
    optional :param1, type: Integer
end

ただし、2 つのパラメーターが相互に排他的であることを指定する便利な方法がわかりません。EG は次のようになります。

params do
    requires :creatureName, type: String
    requires 
        either :scaleType, type: String
        or :furType, type: String 
end

これを回避するための最も便利な方法の提案に興味があります。

4

4 に答える 4

2

パラメータは として定義できmutually_exclusive、リクエスト内で同時に存在しないようにします。

params do
  optional :beer
  optional :wine
  mutually_exclusive :beer, :wine
end

警告:必要なパラメーターを使用して、相互に排他的なセットを定義しないでください。相互に排他的な 2 つの必須パラメーターは、パラメーターが無効であることを意味するため、エンドポイントが役に立たなくなります。オプションのパラメーターと相互に排他的な 1 つの必須パラメーターは、後者が無効であることを意味します。

于 2014-06-05T17:23:59.677 に答える
0

この種のマルチパラメーター制限を DSL に組み込むのは困難です。私の知る限り、解決策は両方のパラメーターをオプションにし、独自のコードを記述して、ルート内で呼び出されるいずれかを確認することです。一貫性のための他の検証と同じ種類のエラーが発生する可能性があります。プロジェクトでよくあるパターンの場合は、ヘルパーを作成します。

params do
    requires :creature_name, type: String
    optional :scale_type, type: String
    optional :fur_type, type: String 
end

post '/creatures/:creature_name' do
  unless param[:scale_type] || param[:fur_type]
    raise Grape::Exceptions::Validation,  { param: "scale_type / fur_type",
        message: "one of scale_type or fur_type must be provided" }
  end
  if param[:scale_type] && param[:fur_type]
    raise Grape::Exceptions::Validation,  { param: "scale_type / fur_type",
        message: "only one of scale_type or fur_type can be provided" }
  end
  # ...
end
于 2014-03-13T08:21:14.860 に答える