如何向 ASP.Net Web API GET 传递多个参数?

我正在使用。NetMVC4WebAPI (希望)实现 RESTful API。我需要向系统传入一些参数,让它执行一些操作,然后返回一个对象列表作为结果。具体来说,我要传递两个日期,并返回它们之间的记录。我还将跟踪返回的记录,以便后续调用不会在系统中重新处理。

我考虑了几种方法:

  1. 将参数序列化为一个 JSON 字符串并在 API 中将其分解。 Http://forums.asp.net/t/1807316.aspx/1

  2. 传递查询字符串中的参数。
    将多个查询参数传递给静态 API 的最佳方法是什么?

  3. 定义路线中的参数: Api/controller/date1/date2

  4. 使用一个 POST,它本质上允许我传递一个带有参数的对象。

  5. 研究 ODATA,因为 Web API (目前)支持它。我还没有做很多这方面的工作,所以我不是很熟悉它。

正确的 REST 实践似乎表明,当数据被提取时,您应该使用 GET。然而,GET 也应该是无效的(不产生任何副作用) ,我想知道我的特定实现是否违反了这一点,因为我在 API 系统中标记了记录,因此我产生了副作用。

这也引出了支持可变参数的问题。如果输入参数列表发生变化,如果经常发生这种情况,那么重新定义选项3的路线就会很麻烦。如果在运行时定义参数会发生什么..。

在任何情况下,对于我的具体实现,哪种选择(如果有的话)似乎是最好的?

357444 次浏览

这个记录标记是什么意思?如果这仅用于记录日志,我将使用 GET 并禁用所有缓存,因为您希望记录此资源的每个查询。如果记录标记还有其他用途,那么 POST 就是最好的选择。用户应该知道,他的行为影响系统和 POST 方法是一个警告。

@ LukLed清楚地解释了使用 走开职位的原因。关于传递参数的方法,我建议使用第二种方法(我也不太了解 ODATA)。

1. 将参数序列化为一个 JSON 字符串,然后在 API.http://forums.asp.net/t/1807316.aspx/1中将其分解

这不是 用户友好搜索引擎优化友好

2. 在查询字符串中传递参数。将多个查询参数传递给静态 API 的最佳方法是什么?

这是通常较为可取的方法。

3. 定义路由中的参数: api/controller/date1/date2

这绝对不是个好办法。这让人感觉某个 date2date1的子资源,但事实并非如此。date1date2都是查询参数,属于同一级别。

在简单的情况下,我建议使用这样的 URI,

api/controller?start=date1&end=date2

但我个人喜欢下面的 URI 模式,但在这种情况下,我们必须编写一些自定义代码来映射参数。

api/controller/date1,date2

我只需要在需要传递参数的地方实现一个 RESTfull api。我通过以与 Mark 的第一个示例“ api/controller? start = date1 & end = date2”所描述的相同样式传递查询字符串中的参数来实现这一点

在控制器中,我使用了来自 在 C # 中分割 URL?的提示

// uri: /api/courses
public IEnumerable<Course> Get()
{
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var system = nvc["System"];
// BL comes here
return _courses;
}

在我的例子中,我通过 Ajax 调用 WebApi,看起来像是:

$.ajax({
url: '/api/DbMetaData',
type: 'GET',
data: { system : 'My System',
searchString: '123' },
dataType: 'json',
success: function (data) {
$.each(data, function (index, v) {
alert(index + ': ' + v.name);
});
},
statusCode: {
404: function () {
alert('Failed');
}
}
});

我希望这能帮上忙。

只需在 WebApiConfig条目中添加一个新路由。

例如,呼叫:

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..

补充:

config.Routes.MapHttpRoute(
name: "GetPagedData",
routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);

然后将参数添加到 HTTP 调用:

GET //<service address>/Api/Data/2/10

我在 http://habrahabr.ru/post/164945/上找到了很好的溶液

public class ResourceQuery
{
public string Param1 { get; set; }
public int OptionalParam2 { get; set; }
}


public class SampleResourceController : ApiController
{
public SampleResourceModel Get([FromUri] ResourceQuery query)
{
// action
}
}

我认为最简单的方法是使用 AttributeRouting

很明显,在您的控制器中,为什么要在 GlobalWebApiConfig文件中使用它?

例如:

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}

{}名称需要与参数匹配。

就这么简单,现在您有了一个单独的 GET来处理这个实例中的多个参数。

 [Route("api/controller/{one}/{two}")]
public string Get(int One, int Two)
{
return "both params of the root link({one},{two}) and Get function parameters (one, two)  should be same ";
}

根链接({ one } ,{ two })和 Get 函数参数(one,two)的参数应该相同

    public HttpResponseMessage Get(int id,string numb)
{
//this will differ according to your entity name
using (MarketEntities entities = new MarketEntities())
{
var ent=  entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
if (ent != null)
{
return Request.CreateResponse(HttpStatusCode.OK, ent);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
}
}
}

我知道这很旧了,但我最近也想要这个,这是我找到的..。

    public HttpResponseMessage Get([FromUri] string var, [FromUri] string test) {
var retStr = new HttpResponseMessage(HttpStatusCode.OK);
if (var.ToLower() == "getnew" && test.ToLower() == "test") {
retStr.Content = new StringContent("Found Test", System.Text.Encoding.UTF8, "text/plain");
} else {
retStr.Content = new StringContent("Couldn't Find that test", System.Text.Encoding.UTF8, "text/plain");
}


return retStr;
}

所以现在在您的地址/URI/..。

Http://myURL/api/myController/? var = getnew & test = test

结果: 「发现测试」


Http (s) ://myURL/api/myController/? var = getnew & test = anything

结果: “找不到那个测试”

现在您可以通过简单地使用

        public string Get(int id, int abc)
{
return "value: " + id + "  " + abc;
}

这将返回: “ value: 510”

如果你用 宣布死亡https://yourdomain/api/yourcontroller?id=5&abc=10

这段代码对我很有用。然后我就可以在 URL 上使用常规的查询字符串了 Http://.../api/getsomething?paramone=1&paramtwo=2

.NET 6核心

[Route("api/GetSomething")]
public IActionResult GetSomething(int paramOne, int paramTwo)
{
...
return Content(jsonData);
}


而不是做以下事情 [ Route (“ api/GetSomething/{ paramOne }/{ parmTwo }”)]