将多个参数传递给 Web API GET 方法 [英] Passing multiple parameters to web API GET method

查看:42
本文介绍了将多个参数传递给 Web API GET 方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have created a WEB API using MySQL Database. The API works as expected for now. I sent a meter serial number and a date time parameter and then GET the expected result. Below is my controller

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}Td{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"
}]

单个序列号被传递时,这所有场景都有效.但是在客户端,会有不止一个不同的序列号.为此,我必须使我的方法适用于一个和多个序列号,前提是所有的日期时间都相同.

This all scenario works when a single serial number is passed. But at client side there would be more than one different serial numbers. For this I had to make my method to work both for one and more than one serial numbers provided the date time will be the same for all.

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 看起来有些帮助,但我不知道它是否会起作用与否.

I have searched for it but most of the times I have found the static method again and again. But this solution looks some what helpful but again I don't know whether it will work or not.

任何帮助将不胜感激.

推荐答案

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

You can pass a custom model to an action method, but I suggest not using the GET for you task because GET does not have a body.

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

Instead, use the SEARCH verb and put the list of serials number and the date inside a custom model in the body.

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

在 .NET Core 2 中,您的控制器将具有类似 -

In .NET Core 2 your controller would have something like -

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

这篇关于将多个参数传递给 Web API GET 方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆