簡體   English   中英

將可選數據傳遞到REST API

[英]Passing optional data to REST API

我們有一個桌面客戶端和一個REST API。 對於幾個POST REST調用,我們希望從客戶端向API傳遞關聯GUID,該GUID用於關聯與同一用戶交互相關的日志條目。

此參數是可選的,並且必須向后兼容,如果省略,則不會失敗。 在保持代碼干凈的同時,可以通過哪些選項進行傳遞?

我擔心如果我這樣說:

  • 在標題中,這意味着接收HttpRequestMessage並手動提取它,每個API調用中的URL參數和正文內容。
  • 在網址中,如果缺少參數(例如,向后兼容),它可能無法找到正確的路由。
  • 在體內,由於參數與系統而不是數據相關,因此污染了模型。

例如,現有方法是:

[HttpPost]
public HttpResponseMessage SaveData([FromBody]DataModel model)
{
    ...
}

我覺得我錯過了一些東西。 哪里是最好的地方?

這很大程度上取決於您的api actionGet還是Post ,如果您使用Get動作,則可以將參數放在標頭中,也可以在route配置中使用默認值作為參數,如下所示:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { **id = RouteParameter.Optional** }
        );

如果使用的是Post操作,則可以輕松地在方法原型中使用默認值:示例:

[HttpPost]
public object DoSomething(int logEntryIndex=0)
{
    return "Something";
}

但我強烈建議您始終使用對象作為參數。 然后,將任何屬性[作為新參數]添加到類中非常容易,並且您永遠不會遇到此類問題

    [HttpPost]
    public object DoSomething(MyParam parameter)
    {
        return "Something";
    }

    public class MyParam
    {
      // prop1
      // prop2
    }

您可以將URL的關聯GUID作為可選參數傳遞,這樣它將向后兼容,干凈並且不會污染您的數據模型。 例如:

[HttpPost]
[Route("api/Contact/{correlationId:Guid?}")]
public HttpResponseMessage SaveData([FromBody]DataModel model, [FromUri] Guid? correlationId = null)
{
    //code to handle request
}

從MSDN:

您可以通過向route參數添加問號來使URI參數為可選。 如果route參數是可選的,則必須為method參數定義一個默認值。

更多信息在這里

希望能幫助到你。

暫無
暫無

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

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