web-dev-qa-db-ja.com

複数のオプションのクエリ文字列パラメーターREST API GET

Web API 2を使用して、安らかなサービスを実装しています。ベストプラクティスに関するいくつかの調査を行った後、誰もが次の方法について異なる意見を持っているようです。 GETがあります

public HttpResponseMessage Get(string crewId, string shiftDate, int offset = 1, int limit = 10)

このGETメソッドはリストを返します。このメソッドからデータを取得する方法は複数あります。

  • CrewIdのみで取得
  • ShiftDateのみで取得
  • CrewIdおよびshiftDateで取得する
  • (1)crewIdとshiftDateをオプションとしてマークしますか?

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10)
    

    そして、何が満たされ、何が満たされていないかを確認して、アクションを実行できるようにするifステートメントがたくさんあります

    if(crewId != null && shiftDate == null){
      // Get by crewId
    }else if(crewId == null && shiftDate != null){
      // Get By shiftDate
    }else if(crewId != null && shiftDate != null){
      // Get By crewId and shiftDate
    }
    

    私にとって、これは特に、コードに多くの「if」ステートメントが含まれる多くのパラメータがある場合に実行するのはクレイジーに見えます。

    あなたは(2)異なるセットのgetを持っていますか?

    public HttpResponseMessage GetByCrewId(string crewId, int offset = 1, int limit = 10)
    public HttpResponseMessage GetByShiftDate(string shiftDate, int offset = 1, int limit = 10)
    public HttpResponseMessage GetByCrewIdShiftDate(string crewId, string shiftDate, int offset = 1, int limit = 10)
    

    そして、あなたはメソッドへのURIルートマップを持っているでしょう

  • .../api/GetByCrewId?crewId = 1234
  • .../api/GetByShiftDate?shiftDate = 1111-11-11
  • .../api/GetByCrewIdShiftDate?crewId = 1234&shiftDate = 1111-11-11
  • オプション2は安らかなですか?

    または、より良いオプションがあります(3)。

    上記の両方のオプションは、ベストプラクティスを使用し、REST標準に従っていることを確認するだけで機能します。何かが欠けているようです。

    8
    Nick Manojlovic

    オプション(2)は必要ありません-URLに名詞が必要なRESTfulです。

    したがって、URLは次のようになります。

    /api/items/?crewId=1234&shiftDate=1111-11-11
    

    (「クルー」と「シフト」のパラメーター名に基づいて、アイテムが何であるかを判断できません。クルーとシフトの日付は何ですか??釣り旅行??その場合、URLは/ apiの方が良いでしょう/ fishing-trips /?crewId = ....&shiftDate = ...

    コントローラーについては、次のようなものを探します:

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10) {
    
        return dataSource.Where(x=> (x.CrewId == crewId || crewId == null)
                && (x.ShiftDate == shiftDate || shiftDate == null));
    }
    
    5
    Anthony

    確認 ベストプラクティス:理解RESTヘッダーとパラメーター それは、クエリパラメーターの使用がオプションであることを示すと述べています。他のオプションは、URIの明確化に役立つ場合があります。

    /api/fishing-trips/crew/{crewid}?shiftdate=1111-11-11
    

    最終的に、アイテムがすべてオプションの場合は、「?」を使用しますおそらく最良のルートです。パラメーターのタイプに関する詳細は、 RFC 657 で入手できます。

    選択は、使用することを選択したキューイングに影響を与える可能性があり、パススタイルのパラメータ展開が最も意味があるかもしれないことに注意してください。 nderstanding REST Parameters にも詳細があります。

    最後に、これらを検索パラメーターとして作成したい場合があります。ユーザーが同じ検索を頻繁に要求している場合は、単一のRESTパスにパッケージ化できます。

    例えば、

    /api/fishing-trips/search?crew=1234
    /api/fishing-trips/search?shiftDate=1111-11-11
    /api/fishing-trips/search?crew=1234&shiftDate=1111-11-11
    

    また、オプションのパラメーターとともに単純化を提供することもできます。たとえば、

    /api/fishing-trips/today
    /api/fishing-trips/today?crew=1234
    /api/fishing-trips/crew/1234/today
    

    これらの最後の例は私の研究から主観的なものですが、詳細情報は Pragmatic Rest APIのベストプラクティス および 検索用のRESTful URLデザイン で入手できます。

    4
    McArthey

    以前にこのようなことをしたことがあります。どちらか一方または両方を使用できるため、オプションのパラメーターを使用します。

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10)
    

    次に、クエリを作成します。たとえば、次のようなもの:

    var query = "";
    if (!String.IsNullOrEmpty(crewId)) {
      query += $"crewId='{crewId}'";
    }
    if (!String.IsNullOrEmpty(shiftDate)) {
      if (query.Length > 0) query += " AND ";
      query += $"shiftDate='{shiftDate}'";
    }
    if (query.Length == 0) {
      //neither crewId or shiftDate were given
      //return some kind of error
    }
    
    2
    Gabriel Luci

    これを自分で実装しようとしていることを考えると、複数のオプションパラメータを持つ単一のGETメソッドアクションでなければなりません。

    どうして? REST APIレイヤーのこのクエリロジックについて心配する必要はありません。結局、複数のパラメーター(つまり_CrewId = 1 AND ShiftDate = 2016-01-01_)を含むAND差別化句を効果的に作成しています。パラメーターを指定せずに、すべてのアイテムを返します。

    デフォルト値が指定され、渡されたパラメーターに基づいて結果を返すSQLストアドプロシージャにパラメーターを最後まで渡します。

    多くの点で、RESTメソッドはCRUDに直接マッピングされるため、APIを次のように扱ってください。 REST APIチュートリアル

    1
    toadflakz