带有许多查询的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

带有许多查询的GET字符串

所以你正在搜索的名称(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