0

我在这里问了一个初步的和有点类似的问题。

现在我需要知道如何从控制器方法/操作中的 RESTful URL 中访问值。

我有一个名为 PlatypusController 的控制器,它的路由在 WebApiConfig 中设置如下:

config.Routes.MapHttpRoute(
    name: "ReportsApi",
    routeTemplate: "api/{controller}/{unit}/{begindate}/{enddate}",
    defaults: new { enddate = RouteParameter.Optional }
);

PlatypusController.cs 有这样的代码:

public void Post()
{
    int i = 2; 
}

当然,“int i = 2”是无稽之谈;我只是把它放在那里,这样我就可以在方法中放置一个断点来验证它是否已到达。当我选择“POST”并在 Postman 中输入此 URL 时:

http://localhost:52194/api/Platypus/gramps/201509

(当我调用它时,该应用程序正在端口 52194 上运行)

但要完成一些有价值的事情,我需要 URL 中的“gramps”和“201509”。我怎样才能访问这些?我是否需要将它们添加到 Post 方法中,如下所示:

public void Post(string unit, string begindate)
{
    DoSomething_Anything(unit, begindate);
}

...或者是否有其他方法来获取它们,例如从 HttpRequest 对象或其他东西?

4

3 回答 3

3

我个人更喜欢在定义我的路由时明确,这就是为什么我推荐属性路由而不是基于约定的路由。

这样,您可以为每个控制器和操作显式配置路由。

不要在 WebApiConfig 中以这种方式配置路由,只需通过调用此行来确保您已初始化属性路由:

config.MapHttpAttributeRoutes();

在 WebApiConfig 文件中。

然后你可以做这样的事情:

[RoutePrefix("api/platypus")]
public class PlatypusController: ApiController
{
     [Route("{unit}/{begindate}")]
     [HttpPost]
     public void Post(string unit, string begindate)
     {
         int i = 2; 
     }
}

要调用此方法,请向以下位置发出 POST 请求:/api/platypus/gramps/201509

于 2015-12-29T22:47:55.380 回答
1

尝试在 Post 方法中添加 [FromBody]

public void Post([FromBody] string unit, [FromBody] string begindate)
{
    DoSomething_Anything(unit, begindate);
}

检查此以获取详细示例:http: //blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

于 2015-12-29T22:47:29.403 回答
0

就像 3.14 一样简单;这很有效:

public void Post(string unit, string begindate)
{
    string _unit = unit;
    string _begindate = begindate;
}

_unit 是“ gramps ”,_begindate 是“ 201509 ”,使用这个 URL:

http://localhost:52194/api/Platypus/gramps/201509

...所以这正是我所需要的。

于 2015-12-29T22:44:29.567 回答