我创建了一个Web-API,并希望使用参数BeginAddress (string)、EndAddress(string)、BegineDate (Datetime)获取所有路由。我用这些属性创建了一个新的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;
}Web API函数
public List<Route> GetAllByCity(SearchRoute sr)
{
return RouteDAO.GetAllByCity(sr);
}更新:如果我这样做,帖子不工作,但如果我创建一个新的控制器,它可以工作。
[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);
}发布于 2016-02-02 03:18:10
即使在使用复杂对象作为参数时,我也更喜欢使用GET。如果您关心URI的长度,那么请记住:
不需要为简单对象(如复杂对象)添加属性名称前缀,因为
如果你,我们拿你的例子
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";
=“
=
结果查询字符串:
?BeginAddress=Some beginning&EndAddress=Some ending&BeginDate=2016-01-01T16:40:00
同样,即使没有对象前缀/限定符,属性也会自动解析并填充对象实例。
向URL添加域信息可能另有50个字符左右的控制器名称可能另有30个字符左右的查询字符串= 82 characters
请注意,我没有考虑将特殊字符(如空格)解析为Url转义字符序列
总计162个字符≈或take
考虑到允许的最大URL长度是2083个字符,这还不错,所以在这个简单的示例中,您只使用了的7%。
这可能是执行此操作的首选方法,因为它符合GET调用/谓词不会改变数据而POST调用/谓词会改变数据的RESTful API standard。
发布于 2013-01-08 22:54:00
可以通过在URI中使用复杂类型来传递对象。您需要使用格式正确的查询字符串来帮助Web API。这将是一个示例:
?SearchRoute.BeginAddress=TheAddressValue&SearchRoute.EndAddress=TheAddressValue但是,如果您的查询字符串开始变得太大,您可能没有正确地对交互进行建模。
然后,在服务器中,您应该让Web API知道它应该在URI中查找值:
public List<Route> GetAllByCity([FromUri]SearchRoute sr)
{
return RouteDAO.GetAllByCity(sr);
}https://stackoverflow.com/questions/14217341
复制相似问题