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);
}