【发布时间】:2020-05-14 11:15:46
【问题描述】:
我只使用过几个 Restful API,并且一直需要创建一个。最终我需要一个 API,并希望有 Restful 方面,但那部分并不是最终的重点。
我创建了一个原型,并且基本的 html 调用工作正常。然后我想转向其他类型的电话。我看过很多文章和 sn-ps,但似乎都没有真正为我回答这个问题。我正在使用 Postman 进行测试。现在我有两个基本调用“Get”调用,它们都带有三个字符串参数,实现它们具有相同的签名但不同的名称。我收到与歧义相关的错误。任何帮助表示赞赏
以下是我的设置:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ApiByName",
routeTemplate: "api/{controller}/{name}",
defaults: null,
constraints: new { name = @"^[a-z]+$" }
);
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
app.UseWebApi(config);
}
}
以下是我的两个方法调用
[Route("{UserId}/{Key}/{Source}", Name = "GetToken")]
[HttpGet]
public HttpResponseMessage GetToken(string UserId, string Key)
{
}
[Route("{Token}/{AcctNo}/{YearMonth}", Name = "GetInvoices")]
[HttpGet]
public HttpResponseMessage GetInvoices(string Token, string AcctNo, string YearMonth)
{
}
如果我注释掉其中一个,另一个会被调用,但我似乎无法让它工作。
-------------更新------------...已将代码修改如下。
“ApiByName”已从配置启动中删除。以下是方法。我包含了一个我以前没有展示过的通用 get。
public IEnumerable<CustomListItem> Get()
{
// return new string[] { "value1", "value2" };
return _listItems;
}
[Route("GetToken/{UserId}/{Key}/{Source}")]
[HttpGet]
public HttpResponseMessage GetToken(string UserId, string Key, string Source)
{
...
}
[Route("GetInvoices/{Token}/{AcctNo}/{YearMonth}")]
[HttpGet]
public HttpResponseMessage GetInvoices(string Token, string AcctNo, string YearMonth)
{
...
}
即使进行了上述更改,调用也总是转到通用 Get(显示第一个方法)以下是来自邮递员的调用示例(以及直接粘贴到浏览器中)??
http://localhost:37788/api/listitems/GetToken?UserId=Dshadle&Key=ABC&Source=Postman
http://localhost:37788/api/listitems/GetInvoices?Token=abc&AcctNo=123&YearMonth=2019/12
【问题讨论】:
-
如何称呼这些动作?我的意思是,你想让他们有不同的路线吗?还是您希望两者都可以从完全相同的路由/URL 访问?
-
我确实希望它们是不同的路线。我已经修改了代码以使用 ActionRoute(如上所示),但它仍然无法正常工作。
标签: c# html rest api asp.net-web-api2