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

Posted

技术标签:

【中文标题】将多个参数传递给 Web API GET 方法【英文标题】:Passing multiple parameters to web API GET method 【发布时间】:2017-10-11 06:04:18 【问题描述】:

我使用mysql 数据库创建了一个WEB API。 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 = @"^\d4-\d2-\d2T\d2:\d2:\d2$" 
       );

网址是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】:

您可以将自定义模型传递给操作方法,但我建议您不要为您的任务使用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 

【讨论】:

以上是关于将多个参数传递给 Web API GET 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将类型的对象作为参数传递给Web Api Get / Post方法

我不能将多个参数传递给 ASP Web API

如何将多个参数传递给 ASP.NET Core 中的 get 方法

如何将字典参数传递给web-api方法?

将多个参数传递给后端 API reactjs

在 ASP.NET C# 中使用 jQuery 将多个参数传递给 Web 方法