簡體   English   中英

Web-API獲取對象

[英]Web-API Get with object

我創建了一個Web-API,我想獲取所有帶有參數BeginAddress(字符串),EndAddress(字符串),BegineDate(日期時間)的路由。 我使用這些屬性創建了一個新的Class SearchRoute。

我可以使用id或字符串執行普通的Getwith,但如何通過給對象執行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;
}

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

即使將復雜對象用作參數,我還是更喜歡使用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 =“一些結局”
  • BeginDate =“ 2016-01-01T16:40:00”

結果查詢字符串:

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

同樣,即使沒有對象前綴/限定符,屬性也將自動解析並填充對象實例。

  • 將域信息添加到URL中,可能再輸入50個左右的字符
  • 添加控制器名稱,也許再添加30個左右的字符
  • 添加查詢字符串= 82個字符

請注意,我沒有考慮將空格等特殊字符解析為網址轉義字符序列

總≈162個字符 或采取

考慮到允許的最大URL長度為2083個字符,這還不錯,因此,在此簡單示例中,您僅用完了7%的字符。

這可能是首選的方法,因為它符合RESTful API標准 ,在該標准下GET調用/動詞不會更改數據,而POST調用/動詞卻可以更改數據。

您可以通過在URI中使用復雜類型來傳遞對象。 您需要通過使用正確格式的查詢字符串來幫助Web API。 這將是一個示例:

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

但是,如果查詢字符串開始變得太大,則可能是交互模型不正確。

然后,在服務器中,應該讓Web API知道它應該在URI中查找值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM