将多个参数传递给Web API GET方法

时间:2017-10-11 06:04:18

标签: linq rest get asp.net-web-api2 asp.net-web-api-routing

我使用WEB API数据库创建了MySQL。 API现在按预期工作。我发送了一个仪表序列号和一个日期时间参数,然后获得了预期的结果。以下是我的控制器

public MDCEntities medEntitites = new MDCEntities();
public HttpResponseMessage GetByMsn(string msn, DateTime dt)
    {          
        try
        {
            var before = dt.AddMinutes(-5);
            var after = dt.AddMinutes(5);

            var result = medEntitites.tj_xhqd
                         .Where(m =>
                         m.zdjh == msn &&
                         m.sjsj >= before &&
                         m.sjsj <= after).Select(m => new { MSN = m.zdjh, DateTime = m.sjsj, Signal_Strength = m.xhqd }).Distinct();


            return Request.CreateResponse(HttpStatusCode.Found, result);
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
        }
    }

以下是我的WebApiConfig文件

config.Routes.MapHttpRoute(
       name: "GetByMsn",
       routeTemplate: "api/{controller}/{action}/{msn}/{dt}",
       defaults: null,
       constraints: new { msn = @"^[0-9]+$" , dt = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$" }
       );

网址为http://localhost:14909/api/meters/GetByMsn/002999000171/2017-10-10T10:08:20

我获得的回应是

[{
    "MSN": "002999000171",
    "DateTime": "2017-10-10T10:04:39",
    "Signal_Strength": "20"
},
{
    "MSN": "002999000171",
    "DateTime": "2017-10-10T10:06:35",
    "Signal_Strength": "19"
},
{
    "MSN": "002999000171",
    "DateTime": "2017-10-10T10:08:31",
    "Signal_Strength": "20"
},
{
    "MSN": "002999000171",
    "DateTime": "2017-10-10T10:10:27",
    "Signal_Strength": "20"
},
{
    "MSN": "002999000171",
    "DateTime": "2017-10-10T10:12:23",
    "Signal_Strength": "20"
}]

当传递single serial number时,此所有方案都有效。但在客户端,会有不止一个不同的序列号。为此,我必须让我的方法同时为一个和多个序列号工作,前提是所有人的日期时间都相同。

One solution is to create a new method a pass the multiple serial number strings, but this will not help because the number of serial numbers are dynamic i.e. they may be one, two to 100's. So setting a hard coded method won't be a solution. 

我已经搜索过了,但大多数时候我一次又一次地找到静态方法。但是这个solution看起来有些有用,但我不知道它是否会起作用。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您可以将自定义模型传递给操作方法,但我建议您不要使用GET任务,因为GET没有正文。

相反,请使用SEARCH动词,并将序列号列表和日期放在正文中的自定义模型中。

public class MeterSearchModel 
{
   public List<string> Serials {get;set;}
   public DateTime Date {get;set;}  
}

在.NET Core 2中,你的控制器会有类似的东西 -

[AcceptVerbs("SEARCH")]
public async Task<IActionResult> Search([FromBody] MeterSearchModel model)
{
    //..perform search 
}