2017-09-27 3 views
1

ExpressJsを使用すると、条件付き(動的または曖昧な)ルートマッチングと一致させることができます。以下のために(ServiceStackを設定する方法があるかどう/people/sex/female
/people/sex/female/age-over/30

/people
および(最も重要)/people/age-over/30ServiceStackクライアントのExpressJs条件付きルート

私は思ったんだけど:GET '/people(/sex/:sexFilter)?(/age-over/:ageOverFilter)?'

のようなルートは、以下の例と一致しますC#Xamarin app)クライアントで、要求オブジェクトプロパティがnullの場合、次のルートを生成します。

解決策は多くの検索フィルタにスケーラブルである必要があるため、フィルタの順列ごとに[Route(...)]属性を維持することはできません。

コールの前に実行時にルートを生成する方法があるかどうかはわかりませんが、それはすばらしいことです。

あなたはサービスが例えば、と呼ばれることができるようにする別のルートをリストする必要がありますServiceStackで

答えて

1

:。

[Route("/people")] 
[Route("/people/sex/{Sex}")] 
[Route("/people/sex/{Sex}/age-over/{AgeOver}")] 
public class SearchPeopleRoute 
{ 
    public string Sex { get; set; } 
    public int? AgeOver { get; set; } 
} 

のC#/。NETサービスクライアントは、その後に基づいて、最も適切なルートを選択しますリクエストDTOには何が埋め込まれていますか。

はServiceStack内のクエリのためには、そのリソース要求に修飾子を適用するために使用される?queryStringながらリソースを識別するために使用され/path/infoとしてHTTP APIを設計するためのより適切である任意のフィルタを適用する?queryStringを使用することをお勧めします。

この規則は、あなたがリクエストDTOを定義することができますembraced in AutoQueryですが好き:

[Route("/people")] 
public class SearchPeople : QueryDb<Person> {} 

そして、あなたはPersonテーブル、上記AUTOQUERYリクエストDTO上の任意のフィールドにimplicit conventionsを照会できるようになる実装を実装することなく、次のクエリを自動的にサポートします:

/people 
/people?sex=female 
/people?ageOver=30 
/people?sex=female&ageOver=30 
+0

偉大な答えをありがとう。 ServiceStackの唯一のソリューションであれば、私が使用するパッケージを変更する必要があります。実行時にルートを作成することができないのは残念です。私はそれがちょっと硬い(意図的に)かもしれないと思う。 RESTルートをどのように形成すべきかについて多くの議論があり、我々がサーバーサイドを行ったときに、それが私たちが選んだ方法です。あなたはおそらく識別子とフィルタがURLで表される方法を分離するのは正しいでしょう。あなたがそれについて考えるとき、彼らは2つの異なる概念です。 –