Web API属性ルーティングのオプションパラメーター


89

次のAPI呼び出しのPOSTを処理したい:

/v1/location/deviceid/appid

追加のパラメータはポストボディから取得されます。

これはすべて私にとってうまくいきます。ここで、「deviceid」や「appid」、および/またはBodyDataをnullにして、コードを拡張します。

/v1/location/deviceid
/v1/location/appid
/v1/location/

これら3つのURLは同じルートで応答する必要があります。

私の最初のアプローチ(BodyDataが必要):

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
    return repository.AddNewLocation(deviceid, appid, BodyData);
}

これは機能せず、コンパイルエラーを返します:

「オプションのパラメータは最後にある必要があります」

次の試み:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

ここで、関数AddNewLocation()は常にBodyData=null呼び出しを取得します-呼び出しがBodyを送信した場合でも。

最後に、3つのパラメーターをすべてオプションに設定します。

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

機能しない:

では、オプションパラメータBodyDataはサポートされていませんFormatterParameterBinding

オプションのパラメーターを含むソリューションが必要なのはなぜですか?私のコントローラーは、POSTを介して「新しい場所の追加」だけを処理します。

自分の例外またはエラーメッセージを間違ったデータで送信したい。呼び出しに欠損値がある場合でも。この場合、コードで例外をスローするか、デフォルトを設定するかを決定できるようにしたいと考えています。

回答:


174

のような着信要求の場合/v1/location/1234、想像できるように、「1234」に対応するセグメントの値がに関連しているかどうかに関係appidなく、Web APIが自動的に判断するのは難しいでしょうdeviceid

ルートテンプレートを次のように変更し、[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]を解析しdeiveOrAppidてIDのタイプを特定する必要があると思います 。

また、ルートテンプレート自体のセグメントをオプションにする必要があります。そうしないと、セグメントは必要と見なされます。?この場合の文字に注意してください。例えば: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


55
?ルートテンプレートの内部は私が探していたものです。+1
Kal_Torak

4
「deviceOrAppId」が最適な設計の選択であるとは言いません。私は、APIが定義によって、可能な場合、何を受け取るかを常に知っているはずだと思います。
Niels Brinch

13
情報のみ- ?文字を使用するアクションuriでパラメータをオプションとしてマークする場合、メソッドシグネチャのパラメータにデフォルト値を提供する必要があります(例:MyMethod(string name = "someDefaultValue"、int?Id = null)。
2017

@RBTあなたは本当のMVPです、私は1分間そこで困惑しました。ありがとうございました!
sm

1
涼しい。@smお役に立てたことを嬉しく思います。コメントが役立つように見えやすくするために、コメントを回答に変換しました。それはキランの投稿のアドオンになります。
RBT 2017年


18

私のコメントを回答に変換して、@ Kiran Chalaの回答を聴衆に役立つように補完します-

?文字を使用したアクションuriでパラメーターをオプションとしてマークする場合、以下に示すように、メソッドシグネチャのパラメーターにデフォルト値を提供する必要があります。

MyMethod(string name = "someDefaultValue", int? Id = null)


同じことをコメントしようとしていた。
Jnr 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.