3

Dictionary<string,string>クエリ文字列に必要なパラメーターを含むさまざまな場所にいくつかのコードがあります。URL の末尾に追加できるように、これをフォーマットするための独自のコードがいくつかあります。私のためにこれを行うこのライブラリに組み込まれているものはありますか?

4

1 に答える 1

8

UriTemplates を使用して Uris を作成することを検討してください。構文は RFC6570 で指定されています。ここに nuget パッケージを含むライブラリを作成しました。

UriTemplates を使用すると、次のようなクエリ パラメーターを入力できるだけでなく、

    [Fact]
    public void ShouldAllowUriTemplateWithQueryParamsWithOneValue()
    {
        var template = new UriTemplate("http://example.org/foo{?bar,baz}");
        template.SetParameter("baz", "yo");


        var uriString = template.Resolve();
        Assert.Equal("http://example.org/foo?baz=yo", uriString);
    }

クエリ文字列パラメーターを指定しなくても心配しないでください。トークンは削除されます。

また、パス パラメータも処理します。

    [Fact]
    public void ShouldAllowUriTemplateWithMultiplePathSegmentParameter()
    {
        var template = new UriTemplate("http://example.org/foo/{bar}/baz/{blar}");
        template.SetParameter("bar", "yo");
        template.SetParameter("blar", "yuck");
        var uriString = template.Resolve();
        Assert.Equal("http://example.org/foo/yo/baz/yuck", uriString);
    }

そして、リストと辞書であるパラメーターを持ついくつかの本当に気の利いたもの、

    [Fact]
    public void ShouldAllowListAndSingleValueInQueryParam()
    {
        var template = new UriTemplate("http://example.org{/id*}{?fields,token}");
        template.SetParameter("id", new List<string>() { "person", "albums" });
        template.SetParameter("fields", new List<string>() { "id", "name", "picture" });
        template.SetParameter("token", "12345");
        var uriString = template.Resolve();
        Assert.Equal("http://example.org/person/albums?fields=id,name,picture&token=12345", uriString);
    }

あらゆる種類のトリッキーな URI エンコーディングの問題を処理します。

    [Fact]
    public void ShouldHandleUriEncoding()
    {
        var template = new UriTemplate("http://example.org/sparql{?query}");
        template.SetParameter("query", "PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?book ?who WHERE { ?book dc:creator ?who }");
        var uriString = template.Resolve();
        Assert.Equal("http://example.org/sparql?query=PREFIX%20dc%3A%20%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2F%3E%20SELECT%20%3Fbook%20%3Fwho%20WHERE%20%7B%20%3Fbook%20dc%3Acreator%20%3Fwho%20%7D", uriString);
    }


    [Fact]
    public void ShouldHandleEncodingAParameterThatIsAUriWithAUriParameter()
    {
        var template = new UriTemplate("http://example.org/go{?uri}");
        template.SetParameter("uri", "http://example.org/?uri=http%3A%2F%2Fexample.org%2F");
        var uriString = template.Resolve();
        Assert.Equal("http://example.org/go?uri=http%3A%2F%2Fexample.org%2F%3Furi%3Dhttp%253A%252F%252Fexample.org%252F", uriString);
    }

まだ機能していない唯一の項目は、URI での 2 バイト Unicode 文字のエンコードです。WinRT および Windows Phone で使用できるようにする PCL ライブラリのプレビュー リリースもあります。

于 2013-10-17T13:59:12.280 に答える