我应该如何将多个parameter passing给ASP.Net Web API GET?

我正在使用.Net MVC4 Web API(希望)实现一个RESTful api。 我需要传递几个参数给系统,​​并执行一些操作,然后返回一个对象列表作为结果。 具体来说,我传递了两个date,并返回落在他们之间的logging。 我还跟踪返回的logging,以便后续调用不会在系统中重新处理。

我已经考虑了一些方法:

  1. 将params串行化成一个单独的JSONstring,并在API中将其分开。 http://forums.asp.net/t/1807316.aspx/1

  2. 传递查询string中的参数。
    将多个查询parameter passing给restful api的最好方法是什么?

  3. 在path中定义参数:api / controller / date1 / date2

  4. 使用本质上允许我传递参数的参数的POST。

  5. 从Web API(目前)支持它开始研究ODATA。 这方面我还没有做太多的工作,所以我不太了解它。

看起来正确的REST实践指示何时拉取数据,您应该使用GET。 但是,GET也应该是无效的(不产生副作用),我不知道我的具体实现是否违反了API标记logging,因此我产生了副作用。

这也导致了我支持可变参数的问题。 如果input参数列表发生变化,如果发生了很多事情,则必须重新定义您的select3的路线,这将非常繁琐。 如果参数是在运行时定义的,会发生什么?

无论如何,对于我的具体实施,哪个select(如果有的话)似乎最好?

这个logging标记是什么意思? 如果这仅用于logging目的,我将使用GET并禁用所有caching,因为您要logging此资源的每个查询。 如果这个logging标记有其他目的,POST是要走的路。 用户应该知道,他的行为影响系统和POST方法是一个警告。

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

在你的控制器中很明显,你为什么要在你的全局WebApiConfig文件中使用这个?

例:

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

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

这样简单,现在你有一个单独的GET在这个实例中处理多个参数。

只需添加一个新的路由到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 

我只需要实现一个RESTfull API,我需要传递参数。 我通过传递查询string中的参数来实现这一点,这与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'); } } }); 

我希望这有帮助…

我发现http://habrahabr.ru/post/164945/上的解决scheme

 public class ResourceQuery { public string Param1 { get; set; } public int OptionalParam2 { get; set; } } public class SampleResourceController : ApiController { public SampleResourceModel Get([FromUri] ResourceQuery query) { // action } } 

@LukLed清楚地解释了使用GETPOST 。 关于你可以传递参数的方法,我会build议使用第二种方法(我也不太了解ODATA )。

1.将参数串行化成一个JSONstring,并在API中分开。 http://forums.asp.net/t/1807316.aspx/1

这不是用户友好SEO友好

2.在查询string中通过参数。 将多个查询parameter passing给restful api的最好方法是什么?

这是通常的优选方法。

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

这绝对不是一个好方法。 这使得感觉有一个date2date1的子资源,情况并非如此。 date1date2都是查询参数,并在同一级别。

在简单的情况下,我会build议这样的URI,

 api/controller?start=date1&end=date2 

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

 api/controller/date1,date2 

使用参数绑定完整描述: http : //www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api