我的web api 2.0项目中已经有了一个动作方法。我想在不干扰现有合同的情况下添加新参数。最好的方法是什么?欣赏任何最佳实践提示:)
这是我打算做的代码示例:
现有代码:
[Route("{myId}",Name="MyId")]
Public IHttpActionResult Get(String myId)
{
//Some more code here
}
网址:http://localhost:8888/webapi/1111
期望做类似下面的事情:
//I want to keep the route name same for backwards compatibility.
[Route("{myId}/{myName}",Name="MyId")]
Public IHttpActionResult Get(String myId,string? myName)
{
//Some more code here
}
网址:http://localhost:8888/webapi/1111/John 上面提到的Url正确地命中了方法,但是我从来没有得到用John填充的第二个参数(myName)。
感谢大家对此的任何帮助。 SREE。
答案 0 :(得分:1)
在您的示例中,您myName
为string?
,不允许这样做:
类型'string'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'
创建了一个测试控制器来实现您的操作
[RoutePrefix("webapi")]
public class TestsController : ApiController {
[HttpGet]
[Route("{myId}/{myName}", Name = "MyId")]
public IHttpActionResult Get(string myId, string myName) {
//Some code to show the values of the parameters
return Ok(new { myId = myId, myName = myName });
}
}
使用webapi/1111/John
进行测试时,会返回以下响应
{"myId":"1111","myName":"John"}
确实包含MyName
的值John
如果尝试向后uri webapi/1111
,则会返回NotFound
响应,因为模板与新操作不匹配。
要解决此问题,您需要使myName
参数可选。要了解有关该检查的更多信息
Optional URI Parameters and Default Values
新路线看起来像
//NOTICE THE `?` ON THE {myName} TEMPLATE
[Route("{myId}/{myName?}", Name = "MyId")]
public IHttpActionResult Get(string myId, string myName = null) {...}
您会注意到myName
在路由{myId}/{myName?}
和操作参数(string myId, string myName = null)
中已成为可选项
现在,当使用webapi/1111
进行测试时,会返回以下响应
{"myId":"1111","myName":null}
这符合您的预期结果以实现向后兼容性。
答案 1 :(得分:0)
字符串是一种引用类型,所以你不需要让它可以为空,它已经是。删除'?'并从属性中删除名称。那么会发生什么?