30

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

ApiController课堂上,我给了一个public string Get()。PuttingGet(string sort)/api/foo一个错误的请求。中的请求实例ApiController类型为System.Net.Http.HttpRequestMessage。它没有QueryStringorParameters属性或任何东西。

4

8 回答 8

34

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

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

Request.GetQueryNameValuePairs()

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

foreach (var parameter in Request.GetQueryNameValuePairs())
{
     var key = parameter.Key;
     var value = parameter.Value;
}
于 2014-04-03T10:44:24.487 回答
21

你可以使用

HttpContext.Current.Request.QueryString
于 2012-11-09T16:30:33.193 回答
7

这是一个从请求中获取查询字符串 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/帐户?q=p

于 2014-09-22T07:23:53.540 回答
4

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

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

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

string value = queryString.Where(nv => nv.Key == "parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault();
于 2016-07-28T00:49:08.763 回答
3

您还可以使用以下

var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value;
于 2017-12-19T07:28:45.857 回答
0

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

于 2012-05-18T17:07:23.020 回答
0

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

例如

  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){}
于 2018-04-03T14:27:04.877 回答
0

添加默认值可以完成这项工作:

public string Get(string sort="")
于 2020-04-08T21:52:52.897 回答