我们有一个桌面客户端和一个REST API。对于多个POST REST调用,我们希望将客户端的关联GUID传递给用于关联与同一用户交互相关的日志条目的API。
此参数是可选的,必须向后兼容,如果省略则不会失败。在保持代码清洁的同时有什么选择可以传递这个?
如果我说的话,我很担心:
例如,现有方法是:
[HttpPost]
public HttpResponseMessage SaveData([FromBody]DataModel model)
{
...
}
我觉得我错过了什么。它最好的地方在哪里?
答案 0 :(得分:1)
它强烈取决于您的api action
Get
或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
}
答案 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
希望它有所帮助。