2

新しい NancyFx プロジェクトに移行する必要がある、正しく構築されていない (動作する) いくつかのルートを含む WCF プロジェクトを継承しました。Nancy アプリで、同じ GET 要求に応答するルートを定義できる必要があります。当分の間、ルートを変更することはできません。

WCF プロジェクトでは、GET リクエストで ...

http://localhost:12345/webapi/GetUsers?UserId=567&Language=en

この UriTemplate と一致します。

UriTemplate = "GetUsers?UserId={userId}&Language={language}


これがナンシーと同等になることを望んでいた

Get["/GetUsers?UserId={userId}&Language={language}"] = p => { ... }

しかし、同じ GET リクエストの結果は 404 になります。

この GET 要求に応答するように Nancy ルートを構築する方法はありますか? そうでない場合、回避策はありますか?

これが恐ろしいことなのは承知していますが、適切な残りのフル URL を呼び出すようにフロントエンドを書き直す時間を UI チームとスケジュールできるようになるまでの一時的なものです。

4

2 に答える 2

8

ジョン、

あなたのルートは/GetUsers(ちなみにその部分をどのように処理してい/webapiますか?それはアプリケーションのベースURLですか、それともモジュールパスを設定していますか?)、Request.Queryメンバーを使用してクエリ文字列を読み取ります。

Query プロパティは、プロパティまたはディクショナリとしてDynamicDictionary値にアクセスできるようにする を返します。Request.Query.UserIdRequest.Query["UserId"]

ルートを呼び出すために一致させる必要があるパターンのクエリ文字列部分を作成することはできません。本当にやりたい場合は、ルート宣言の 2 番目のパラメーターであるルート条件を使用することができます。これにより、ルートを使用してもよいかどうかを判断する述語を制御できます。だから、あなたはこのようなことをすることができます

Get["/GetUsers", ctx => ctx.Request.Query.UserId.HasValue && ctx.Request.Query.Language.HasValue] = p {... }

次に、すべてを NancyContext の拡張メソッドにリファクタリングして、少し整理することができます。

Get["/GetUsers", ctx => ctx.HasQueryValues("UserId", "Language")] = p {... }

拡張子を次のようにします

public static bool HasQueryValues(this NancyContext context, params string[] values)
{
   return values.All(x => context.Request.Query[x].HasValue);
}

お役に立てれば!

于 2012-09-21T21:13:23.630 に答える
5

@TheCodeJunkieの回答に続いて、リクエストが有効であることを確認するために値をNancyContext事前にチェックするルート条件を提供するようにを拡張するという彼のアイデアに少し興奮しました。Query私はさらに、値、コレクション、さらにはコレクションNancyContextに対して同じ事前チェックを提供するように拡張しました。FormHeaderFiles

public static bool HasQuery(this NancyContext context, params string[] values)
{
    var query = context.Request.Query;
    return values.All(value => query[value].HasValue);
}

public static bool HasForm(this NancyContext context, params string[] values)
{
    var form = context.Request.Form;
    return values.All(value => form[value].HasValue);
}

public static bool HasHeader(this NancyContext context, params string[] values)
{
    var headers = context.Request.Headers;
    return values.All(value => !headers[value].FirstOrDefault().IsEmpty());
}

public static bool HasFile(this NancyContext context, params string[] values)
{
    var files = context.Request.Files;
    return values.All(value => files.Any(file => file.Key == value));
}

これにより、クエリとフォームの値を検証していた儀式用のコードを削除することができました(これを覚えていたとき、それは毎回ではありませんでした)。したがって、最初にチェックを行うことを覚えやすく、読みやすく、覚えやすい、よりクリーンなコードを取得できます。次に例を示します。

Post["/"]=_=>
{
    var form = Request.Form;
    if (
        !form.username.HasValue ||
        !form.password.HasValue ||
        !form.email.HasValue ||
        !form.claim.HasValue)
    {
        return HttpStatusCode.UnprocessableEntity;
    }
    //process form values with confidence
}

Post["/", ctx => ctx.HasForm("username", "password", "email", "claim")]=_=>
{
    //process form values with confidence   
};
于 2012-09-22T17:03:33.750 に答える