将可选数据传递给REST API

时间:2017-10-30 06:02:20

标签: c# rest asp.net-web-api

我们有一个桌面客户端和一个REST API。对于多个POST REST调用,我们希望将客户端的关联GUID传递给用于关联与同一用户交互相关的日志条目的API。

此参数是可选的,必须向后兼容,如果省略则不会失败。在保持代码清洁的同时有什么选择可以传递这个?

如果我说的话,我很担心:

  • 在标题中,表示接收HttpRequestMessage并手动提取它,每个API调用中的URL参数和正文内容。
  • 在URL中,如果缺少参数,它可能无法访问正确的路由(例如,向后兼容性。)
  • 在体内,它会污染模型,因为参数与系统而不是数据有关。

例如,现有方法是:

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

我觉得我错过了什么。它最好的地方在哪里?

2 个答案:

答案 0 :(得分:1)

它强烈取决于您的api action GetPost,如果您使用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
    }

答案 1 :(得分:1)

您可以将URL中的关联GUID作为可选参数传递,以便它可以向后兼容,清理并且不会污染您的数据模型。例如:

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

来自MSDN:

  

您可以通过向问题添加问号来使URI参数成为可选项   路线参数。如果route参数是可选的,则必须定义a   方法参数的默认值。

更多信息here

希望它有所帮助。