1. ホーム
  2. c#

[解決済み] Web Api の属性ルーティングにおけるオプションパラメータ

2022-12-07 23:38:03

質問

以下のAPI-Callの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 - を送信するようになりました。

最後に、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を介して新しい場所の追加を処理します。

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

どのように解決するのですか?

のような着信リクエストに対して /v1/location/1234 のようなリクエストに対して、Web API が自動的に '1234' に対応するセグメントの値が appid に関連していて deviceid .

ルートテンプレートは以下のように変更した方が良いと思います。 [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")] のように変更してから deiveOrAppid を解析してidの種類を把握します。

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