gpt4 book ai didi

asp.net-web-api - 如何将复杂类型参数(DTO 对象)传递给 GET 请求?

转载 作者:行者123 更新时间:2023-12-04 02:24:55 28 4
gpt4 key购买 nike

我有一个 n 层应用程序,而核心 Web 服务是使用 Web API 构建的。许多 Web 服务的方法都设置为 HTTPGET 并接受 DTO 对象作为参数。我使用 MVC 5 构建的客户端应用程序使用 HttpClient 调用此 API。

所以看起来通过使用 client.PostAsJsonAsync() 我可以传递一个对象,而 client.GetAsync() 不允许我这样做。这迫使我在 URL 中明确指定 DTO 的属性,这有效,但似乎有点多余。

有人可以解释为什么这不可能通过 GET 调用并提出更好的做法吗?

最佳答案

为什么在 URI 中传递数据似乎是多余的? HTTP 规范规定 GET 方法不使用正文中发送的内容。这主要是为了促进缓存能够缓存仅基于 URI、方法和 header 的响应。要求缓存解析消息正文以识别资源将是非常低效的。

这是一个基本的扩展方法,可以为您完成繁重的工作,

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

关于asp.net-web-api - 如何将复杂类型参数(DTO 对象)传递给 GET 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722198/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com