首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web-API Get with object

Web-API Get with object
EN

Stack Overflow用户
提问于 2013-01-08 22:39:01
回答 2查看 4.5K关注 0票数 3

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

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

是否可以对对象执行post/put操作,然后请求返回?

代码语言:javascript
复制
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;
}

Web API函数

代码语言:javascript
复制
public List<Route> GetAllByCity(SearchRoute sr)
{
    return RouteDAO.GetAllByCity(sr);
}

更新:如果我这样做,帖子不工作,但如果我创建一个新的控制器,它可以工作。

代码语言:javascript
复制
[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);
}
EN

回答 2

Stack Overflow用户

发布于 2016-02-02 03:18:10

即使在使用复杂对象作为参数时,我也更喜欢使用GET。如果您关心URI的长度,那么请记住:

不需要为简单对象(如复杂对象)添加属性名称前缀,因为

  1. 对象绑定可以仅根据属性名称自动解析。
  2. maximum allowed URL length为2083个字符,在大多数情况下已经绰绰有余。

如果你,我们拿你的例子

代码语言:javascript
复制
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

Some beginning";

  • EndAddress = "Some ending"

  • BeginDate = "2016-01-01T16:40:00"

  • BeginAddress = "Some ending“
  • BeginDate=”Some“2016-01-01T16:40:00”

=“

  • BeginAddress=”Some ending“
  • BeginDate=”Some“2016-01-01T16:40:00”

=

  • BeginAddress=“Some ending”
  • BeginDate=“Some ending”
  • BeginDate=“2016-01-01T16:40:00”

结果查询字符串:

?BeginAddress=Some beginning&EndAddress=Some ending&BeginDate=2016-01-01T16:40:00

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

向URL添加域信息可能另有50个字符左右的控制器名称可能另有30个字符左右的查询字符串= 82 characters

  • Add

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

总计162个字符≈或take

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

这可能是执行此操作的首选方法,因为它符合GET调用/谓词不会改变数据而POST调用/谓词会改变数据的RESTful API standard

票数 3
EN

Stack Overflow用户

发布于 2013-01-08 22:54:00

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

代码语言:javascript
复制
?SearchRoute.BeginAddress=TheAddressValue&SearchRoute.EndAddress=TheAddressValue

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

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

代码语言:javascript
复制
public List<Route> GetAllByCity([FromUri]SearchRoute sr)
    {
        return RouteDAO.GetAllByCity(sr);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14217341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档