【问题标题】:How to get GET parameters with ASP.NET MVC ApiController如何使用 ASP.NET MVC ApiController 获取 GET 参数
【发布时间】:2012-05-26 06:38:17
【问题描述】:

我觉得问这个有点荒谬,但我找不到获取获取请求参数的方法 例如/api/foo?sort=name

ApiController 类中,我给出了public string Get()。输入Get(string sort) 会使/api/foo 成为一个错误的请求。 ApiController 中的请求实例的类型为 System.Net.Http.HttpRequestMessage。它没有QueryStringParameters 属性或任何东西。

【问题讨论】:

  • 这是你的 get/id 还是你想要做的?对于没有 id 的获取,返回一个 IQueryable。如果您想完全支持 REST,则需要 GET() 和 GET(id)。
  • 对不起,应该指定。我正在尝试创建一个 API 以返回其内容受 get? 参数影响的 json。我并没有直接通过 API 公开数据源
  • 如果您需要评估的不仅仅是 id,那么您需要使用 IQueryable 并使用 Odata。
  • 如果你有 Get(string sort),那么 api/foo 和 api/foo?sort=name 都应该路由到你的 Get 方法。你是说你得到一个 400 错误?
  • Rick Strahl 对此有一个great blog,其中包含一些我最终使用的扩展...

标签: asp.net-mvc api asp.net-mvc-4 asp.net-web-api


【解决方案1】:

添加一个默认值就可以了:

public string Get(string sort="")

【讨论】:

    【解决方案2】:

    将所有查询字符串名称/值对放入一个变量中:

    IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs();
    

    然后提取指定的查询字符串参数

    string value = queryString.Where(nv => nv.Key == "parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault();
    

    【讨论】:

      【解决方案3】:

      如果我们有适合该请求的模型

      例如

        public class JustModel 
          {
            public int Id {get;set;}
            public int Age {gets;set;}
          }
      

      像这样查询

      /api/foo?id=1&Age=10
      

      你可以只使用[FromUri]属性

      例如

      public IHttpActionResult GetAge([FromUri] JustModel model){}
      

      【讨论】:

        【解决方案4】:

        你也可以使用下面的

        var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value;
        

        【讨论】:

        • 当立即在其上使用 .Value 时为 KeyValuePair 返回默认值时,这可能无法按预期工作。
        【解决方案5】:

        这是一个从请求中获取查询字符串 q 并使用它来查询帐户的示例:

                var q = Request.GetQueryNameValuePairs().Where(nv => nv.Key =="q").Select(nv => nv.Value).FirstOrDefault();
                if (q != null && q != string.Empty)
                {
                    var result = accounts.Where(a=>a.Name.ToLower().StartsWith(q.ToLower()));
                    return result;
                }
                else
                {
                    throw new Exception("Please specify a search query");
                }
        

        这可以这样调用:

        url/api/Accounts?q=p

        【讨论】:

        • 或者更好:var q = Request.GetQueryNameValuePairs().SingleOrDefault(nv => nv.Key =="q");
        • 你是对的,这样写更好,但在我的情况下,将 Select(nv => nv.Value) 添加到它
        【解决方案6】:

        ApiController 旨在在没有 HttpContext 对象的情况下工作(使其可移植,并允许在 IIS 之外托管)。

        您仍然可以访问查询字符串参数,但它是通过以下属性完成的:

        Request.GetQueryNameValuePairs()
        

        这是一个遍历所有值的示例:

        foreach (var parameter in Request.GetQueryNameValuePairs())
        {
             var key = parameter.Key;
             var value = parameter.Value;
        }
        

        【讨论】:

        • GetQueryNameValueParirs() 在 Request 对象上不可用。它在“使用 System.Net.Http;”之后起作用了
        【解决方案7】:

        你可以使用

        HttpContext.Current.Request.QueryString
        

        【讨论】:

        • 这在 mvc3 中的 ApiController 上下文中不起作用
        【解决方案8】:

        您正在尝试构建 OData 网络服务?如果是这样,只需返回一个 IQueryable,Web API 将完成剩下的工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-06
          • 2011-09-06
          • 2015-11-12
          • 2021-12-12
          • 2011-12-08
          • 1970-01-01
          • 2016-04-27
          • 1970-01-01
          相关资源
          最近更新 更多