Web API 2を使用して、安らかなサービスを実装しています。ベストプラクティスに関するいくつかの調査を行った後、誰もが次の方法について異なる意見を持っているようです。 GETがあります
public HttpResponseMessage Get(string crewId, string shiftDate, int offset = 1, int limit = 10)
このGETメソッドはリストを返します。このメソッドからデータを取得する方法は複数あります。
(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ルートマップを持っているでしょう
オプション2は安らかなですか?
または、より良いオプションがあります(3)。
上記の両方のオプションは、ベストプラクティスを使用し、REST標準に従っていることを確認するだけで機能します。何かが欠けているようです。
オプション(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));
}
確認 ベストプラクティス:理解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デザイン で入手できます。
以前にこのようなことをしたことがあります。どちらか一方または両方を使用できるため、オプションのパラメーターを使用します。
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
}
これを自分で実装しようとしていることを考えると、複数のオプションパラメータを持つ単一のGET
メソッドアクションでなければなりません。
どうして? REST APIレイヤーのこのクエリロジックについて心配する必要はありません。結局、複数のパラメーター(つまり_CrewId = 1 AND ShiftDate = 2016-01-01
_)を含むAND
差別化句を効果的に作成しています。パラメーターを指定せずに、すべてのアイテムを返します。
デフォルト値が指定され、渡されたパラメーターに基づいて結果を返すSQLストアドプロシージャにパラメーターを最後まで渡します。
多くの点で、RESTメソッドはCRUDに直接マッピングされるため、APIを次のように扱ってください。 REST APIチュートリアル