3

私は n 層アプリケーションを持っていますが、コア Web サービスは Web API で構築されています。Web サービスのメソッドの多くは HTTPGET として設定され、DTO オブジェクトをパラメーターとして受け入れます。MVC 5 で構築された私のクライアント アプリは、HttpClient を使用してこの API を呼び出しています。

したがって、 client.PostAsJsonAsync() を使用することでオブジェクトを渡すことができるようですが、 client.GetAsync() を使用するとオブジェクトを渡すことができません。これにより、URL で DTO のプロパティを明示的に指定する必要があります。これは機能しますが、少し冗長に思えます。

誰かが GET 呼び出しでこれが不可能な理由を説明し、より良い方法を提案できますか?

4

1 に答える 1

5

URI でデータを渡すことが冗長に見えるのはなぜですか? HTTP 仕様では、GET メソッドは本文で送信されたコンテンツを使用しないと規定されています。これは主に、キャッシュが URI、メソッド、およびヘッダーのみに基づいて応答をキャッシュできるようにするためのものです。メッセージの本文を解析してリソースを識別するためにキャッシュを必要とするのは、非常に非効率的です。

これは、面倒な作業を行う基本的な拡張メソッドです。

 public static class UriExtensions
    {
        public static Uri AddToQuery<T>(this Uri requestUri,T dto)
        {
            Type t = typeof (T);
            var properties = t.GetProperties();
            var dictionary = properties.ToDictionary(info => info.Name, 
                                                     info => info.GetValue(dto, null).ToString());
            var formContent = new FormUrlEncodedContent(dictionary);

            var uriBuilder = new UriBuilder(requestUri) {Query = formContent.ReadAsStringAsync().Result};

            return uriBuilder.Uri;
        }
    }

このようなDTOがあると仮定すると、

 public class Foo
    {
        public string Bar { get; set; }
        public int Baz { get; set; }
    }

このように使えます。

    [Fact]
    public void Foo()
    {
        var foo = new Foo()
        {
            Bar = "hello world",
            Baz = 10
        };

        var uri = new Uri("http://example.org/blah");
        var uri2 = uri.AddToQuery(foo);

        Assert.Equal("http://example.org/blah?Bar=hello+world&Baz=10", uri2.AbsoluteUri);
    }
于 2014-03-28T20:10:42.937 に答える