2016-10-14 6 views
0

私はオプションのパラメータのセットを受け入れるgetメソッドを持っています。web apiのスペル間違ったfromuriパラメータ

public HttpResponseMessage Get([FromUri] Parameter parameter) 
    --------------------------- 
    public class Parameter 
    { 
     public string TransactionStatus { get; set; } 
     public string AllVersions { get; set; } 
     public string RunNumber { get; set; } 
    } 

私はAPI /アイテムを使用してAPIを呼んでいる?transactionStatus = 1またはAPI /アイテム?transactionStatus = 1&allVersions =真。私の質問は、私が要求に応じてスペルの間違いをキャッチ/防止する方法です。 api/item?transactionStatus = 1&MISSPELLED = trueが呼び出された場合、「url is not valid」というエラーが発生したとします。ここで

+0

http://stackoverflow.com/a/22423612/1260204を参照してください。クエリ文字列パラメータを繰り返し処理する必要があり、期待されるパラメータセットで定義されていないインクルードパラメータは、コードで例外をスローする必要があります。私はそれに反対することをお勧めします。パラメータがオプションで、スペルが悪い場合でもパラメータが含まれていない場合は、それが存在しないかのように扱います。オプションでないパラメータが含まれていない場合にのみエラーを返すか、フレームワークがそれを処理するようにルートを設定します(デフォルト)。 – Igor

+0

これはパブリックAPIの場合、キャッシングが発生しないようにするために、 '&ts = TIMESTAMP'などを追加するようなライブラリを見てきました。あなたはそのようなことを壊さないように気をつけたいかもしれません。 – dman2306

+0

これは役に立ちます。ありがとうございました。パラメータのスペルが間違っている場合でも、オプションであってもエラーをスローしたい。場面の裏側のスペルが間違っているためにパラメータが無視されるように、ユーザはそれを気づかずに出力を正当なものとして扱います。 – Andrei

答えて

2

は、LINQを使用した方法です:

  1. だけでキーを選択し、NameValuePairsとしてクエリパラメータを取得し、リストに変換します。

  2. パラメータクラスのプロパティを取得し、名前のみを選択してリストに変換します。

  3. 両方のリストのセットの相違点を見つけます。

    var queryParameters = Request.GetQueryNameValuePairs().Select(q => q.Key).ToList(); 
    var parameterProperties = typeof(Parameter).GetProperties().Select(p => p.Name).ToList(); 
    var difference = queryParameters.Except(parameterProperties); 
    

    違いは、あなたのパラメータのクラスのプロパティではありませんURLで渡されたパラメータを含むIEnumerableを次のようになります。

ここではいくつかのコードです。これが空でない場合は、エラーを投げたり、どのパラメータが誤っていたり間違っているかを伝えたりすることもできます。

+0

私はあなたが投稿したものをちょうどやった。ありがとう:) – Andrei

関連する問題