gpt4 book ai didi

c# - Web-API 获取对象

转载 作者:行者123 更新时间:2023-11-30 21:01:21 25 4
gpt4 key购买 nike

我创建了一个 Web-API,我想获取所有带有参数 BeginAddress(字符串)、EndAddress(字符串)、BegineDate(日期时间)的路由。我使用这些属性创建了一个新的类 SearchRoute。

我可以用一个 id 或一个字符串做一个普通的 Get,但是如何通过给一个对象来做一个 Get?这可能吗?

有没有可能用一个对象做一个 post/put 而不是要求返回?

using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url + userid);
if (response.IsSuccessStatusCode)
{
string content = await response.Content.ReadAsStringAsync();
List<Route> list = await SerializeService.Deserialize<List<Route>>(content);
return list;
}
return null;
}

网络接口(interface)函数

public List<Route> GetAllByCity(SearchRoute sr)
{
return RouteDAO.GetAllByCity(sr);
}

更新:如果我这样做,Post 将不起作用,但如果我创建一个新 Controller ,它就会起作用。

[HttpPost]
// POST api/route
public void Post([FromBody]Route route)
{
RouteDAO.Create(route);
}

// POST api/route
[HttpPost]
public List<Route> Post([FromBody]SearchRoute sr)
{
return RouteDAO.GetAllByCity(sr);
}

最佳答案

即使使用复杂对象作为参数,我也更喜欢坚持使用 GET。如果您担心 URI 的长度,请记住:

  1. 没有必要为简单或复杂的对象添加属性名称前缀,因为 Web API 对象绑定(bind)可以仅根据属性名称自动解析。
  2. maximum allowed URL length是 2083 个字符,这在大多数情况下绰绰有余。

如果你是我们的榜样

public class SearchRoute {
public string BeginAddress {get;set;}
public string EndAddress {get;set;}
public DateTime BeginDate {get;set;}
}

[HttpGet]
public List<Route> Get([FromUri]SearchRoute sr)
{
return RouteDAO.GetAllByCity(sr);
}

搜索时的Uri

  • BeginAddress = "一些开始";
  • EndAddress = "一些结尾"
  • 开始日期 = "2016-01-01T16:40:00"

结果查询字符串:

?BeginAddress=一些开头&EndAddress=一些结尾&BeginDate=2016-01-01T16:40:00

同样,即使没有对象前缀/限定符,属性也会自动解析并填充对象实例。

  • 将域信息添加到 URL 中,可能再添加 50 个左右的字符
  • 添加一个 Controller 名称,也许另外 30 个左右的字符
  • 添加查询字符串 = 82 个字符

请注意,我没有考虑将空格等特殊字符解析为 Url 转义字符序列

总计 ≈ 162 个字符 给或拿

考虑到允许的最大 URL 长度为 2083 个字符,这还不错,所以在这个简单示例中,您仅使用了 7% 可能的字符。

这可能是首选的方式,因为它符合 RESTful API standard其中 GET 调用/动词不改变数据而 POST 调用/动词改变数据。

关于c# - Web-API 获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217341/

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