3

我创建了一个 Web-API,我想使用参数 BeginAddress (string)、EndAddress(string)、BegineDate (Datetime) 获取所有路由。我用这些属性创建了一个新的类 SearchRoute。

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

是否可以对一个对象进行发布/放置而不是要求退货?

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

网页 API 功能

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

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

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

2 回答 2

3

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

  1. 不需要为简单对象和复杂对象添加属性名称前缀,因为 Web API 对象绑定可以仅根据属性名称自动解析。
  2. 允许的最大 URL 长度为 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=Some beginning&EndAddress=Some ending&BeginDate=2016-01-01T16:40:00

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

  • 将域信息添加到 URL 可能另外 50 个左右的字符
  • 添加一个控制器名称可能另外 30 个左右的字符
  • 添加查询字符串 = 82 个字符

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

总共 ≈ 162 个 字符

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

这可能是首选的方法,因为它符合RESTful API 标准,其中 GET 调用/动词不会更改数据,而 POST 调用/动词会这样做。

于 2016-02-01T19:18:09.780 回答
1

您可以通过在 URI 中使用复杂类型来传递对象。您需要使用格式正确的查询字符串来帮助 Web API。这将是一个例子:

?SearchRoute.BeginAddress=TheAddressValue&SearchRoute.EndAddress=TheAddressValue

但是,如果您的查询字符串开始变得太大,您可能会错误地对交互进行建模。

然后,在服务器中,您应该让 Web API 知道它应该在 URI 中查找值:

public List<Route> GetAllByCity([FromUri]SearchRoute sr)
    {
        return RouteDAO.GetAllByCity(sr);
    }
于 2013-01-08T14:54:00.417 回答