将多个参数传递给 web API GET 方法
Passing multiple parameters to web API GET method
我使用 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 = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$" }
);
URL是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 看起来有些帮助,但我还是不知道它是否有效。
非常感谢任何帮助。
您可以将自定义模型传递给操作方法,但我建议不要为您的任务使用 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
}
我使用 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 = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$" }
);
URL是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 看起来有些帮助,但我还是不知道它是否有效。
非常感谢任何帮助。
您可以将自定义模型传递给操作方法,但我建议不要为您的任务使用 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
}