我应该如何将多个parameter passing给ASP.Net Web API GET?
我正在使用.Net MVC4 Web API(希望)实现一个RESTful api。 我需要传递几个参数给系统,并执行一些操作,然后返回一个对象列表作为结果。 具体来说,我传递了两个date,并返回落在他们之间的logging。 我还跟踪返回的logging,以便后续调用不会在系统中重新处理。
我已经考虑了一些方法:
-
将params串行化成一个单独的JSONstring,并在API中将其分开。 http://forums.asp.net/t/1807316.aspx/1
-
传递查询string中的参数。
将多个查询parameter passing给restful api的最好方法是什么? -
在path中定义参数:api / controller / date1 / date2
-
使用本质上允许我传递参数的参数的POST。
-
从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清楚地解释了使用GET或POST 。 关于你可以传递参数的方法,我会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
这绝对不是一个好方法。 这使得感觉有一个date2
是date1
的子资源,情况并非如此。 date1
和date2
都是查询参数,并在同一级别。
在简单的情况下,我会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