带有许多查询的GET字符串
本文关键字:GET 字符串 查询 许多 | 更新日期: 2023-09-27 18:17:06
我需要做一个查询字符串,可变长,可以有几个同时查询:字符串:
http://localhost:39051/api/values/punto1?name=125.25
http://localhost:39051/api/values/punto1?name=125.25&name1=1&name2=23.98
http://localhost:39051/api/values/punto1?name=125.25&name1=1&name2=23.98&name3=12.5
http://localhost:39051/api/values/punto1?name=125.25&name1=1&name2=23.98&name3=12.5&name6=34&name23=3
我在webApiConfig.cs
中有这个配置config.Routes.MapHttpRoute(
name: "name",
routeTemplate: "api/{controller}/{id}/{name}/{name1}/{name2}",
defaults: new { id = RouteParameter.Optional, action = "GetProductsByName", name = string.Empty, name1 = string.Empty, name2 = string.Empty });
我调用GetProductsByName(....),这是在ValuesController.cs,那里是GET, POST等
public string GetProductsByName (string name, string name1, string name2)
{
return "Requested name:" + ":" + name + ":" + name1 + ":" + name2;
}
它工作并给我参数name, name1, name2和。但是如果我想看到更多的参数,我必须在config.Routes中定义。这使得系统更加复杂。
需要将数据分成两部分,放在字符串变量中。例如:
http://localhost:39051/api/values/punto1?name=125.25&name1=1&name2=23.98
string1: punto1
和另一个字符串放在后面?
string2: name=125.25&name1=1&name2=23.98
或
string2: name=125.25&name1=1&name2=23.98&name3=12.5&name6=34&name23=3
根据情况
然后string2分离进程扫描值。
它工作得很好,我试了一下,正确地带来了数据。
再一个查询,如果我得到4个不同的参数,在协商中,将参数分离例如:
http://localhost:39051/api/values/punto1.25?name=5.25&name1=1&valor1=23.98&valor2=0.125&book2=17&book1=8&nivel15=9&nivel20=8
所以你正在搜索的名称(s),但你可以有任何数量的名称传入?
你可以绑定到一个List<string>
,以防止你需要添加参数和编辑你的路由。
public string Get([FromUri]List<string> Names)
{
string output = "Requested name";
foreach (var item in Names)
{
output += ":" + item;
}
return output;
}
要让它与你的URL一起工作你需要以
的形式发送参数例如名称[0]= firstparam& names1 = secondParam
:http://localhost:39051/api/values?names[0]=name1&names[1]=name2&names[2]=name3
将产生输出
请求的名称:name1: name2: name3
或者,只要你保持名称不变,你可以删除索引并像这样传递参数:http://localhost:39051/api/values?names=name1&names=name2&names=name3
注意,[FromUri]
告诉模型绑定器从Uri中获取值。如果你有一个Post
而不是Get
,那么你就不需要[FromUri]
,因为数据将在正文中。
这样,当你想要添加新参数时,你根本不需要改变你的路由。
请注意浏览器允许的Uri长度是有限制的。有关更多信息,请参阅此Stackoverflow问题。
编辑
因为你不能改变URL,我认为你唯一能做的就是创建你自己的ModelBinder
。
你可以创建一个绑定器来检查符合特定条件的参数,然后在你的action方法中将这些参数转换成列表或字典。
要创建ModelBinder
,你需要创建一个实现IModelBinder
的类,然后在你的action方法中,你需要用ModelBinder
属性来装饰你想要绑定的参数。
一个非常只处理querystring参数的粗略示例是:
public class MyModelBinder : IModelBinder
{
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
{
List<string> names = new List<string>();
if (!string.IsNullOrEmpty(actionContext.Request.RequestUri.Query))
{
foreach (var item in actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value))
{
if (item.Key.ToLower().StartsWith("name"))
{
//it's a "nameX" parameter so let's add it to the list
names.Add(item.Value);
}
}
}
//this is what will be bound to "name" in the action method
bindingContext.Model = names;
return true;
}
}
然后在action方法中你可以连接你的binder:
public string Get([ModelBinder(typeof(MyModelBinder))] List<string> name)
{
string output = "Requested name";
foreach (var item in name)
{
output += ":" + item;
}
return output;
}
给定querystring
http://localhost:39051/api/values?name=name1&name1=name2&name2=name3
将再次产生输出
请求的名称:name1: name2: name3
它工作得很好,我试过了,并正确地带来了数据。
再一个查询,如果我得到4个不同的参数,在协商中,将参数分离例如:
http://localhost:39051/api/values/punto1.25?name=5.25&name1=1&valor1=23.98&valor2=0.125&book2=17&book1=8&nivel15=9&nivel20=8