【问题标题】:how to do a post to url of pattern /api/{controller}/{action}/{id}?如何发布到模式 /api/{controller}/{action}/{id} 的 url?
【发布时间】:2014-01-23 17:52:51
【问题描述】:

我的控制器方法写如下:

public class WorkerController : ApiController
{
    //POST
    //api/worker/unregister/<id>
    //http body:
    //status=<status>
    [HttpPost]
    public void Unregister(int status)        
    {
        //stuff
    }
}

每当我提出请求时,它都会显示资源未找到 (404)。

正确的接线方式是什么?

编辑:使用 PostMan chrome 扩展连接呼叫 - 休息客户端:

http://localhost:xxxx/api/worker/unregister/3

...然后我像往常一样传递帖子参数。它的x-www-form-urlencoded

更新:

尝试了以下方法:

public class WorkerController : ApiController
{

    [HttpGet]
    public void Unregister(int id, int status)        
    {
        //stuff
    }
}

...并传递如下网址:

http://localhost:xxxx/api/worker/unregister/3?status=-1

成功了!

但是为什么其他的不起作用。这是 WebApiConfig.cs 中的代码:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {            

        config.Routes.MapHttpRoute(
            name: "ServiceApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

【问题讨论】:

  • 你能说明你是如何调用你的方法的吗
  • @Nilesh 添加了更多信息

标签: asp.net-web-api asp.net-web-api-routing


【解决方案1】:

在您的控制器中,您使用status 作为参数名称,而在WebApiConfig.cs 中,您使用id 作为参数名称

像这样更改您的WebApiConfig.cs

 config.Routes.MapHttpRoute(
            name: "ServiceApi",
            routeTemplate: "api/{controller}/{action}/{status}",
            defaults: new { status = RouteParameter.Optional }
        );

【讨论】:

  • 道歉。我可能错过了提到我需要idstatus 作为请求的一部分。当我提到 我像往常一样传递 post 参数时,我意识到这并不是暗示。
  • @deostroll 我没有得到你..你到底想要什么? routeidstatus 作为参数
  • 不是route。我希望它以某种方式成为http request 的一部分。不确定是否可以将两个值都输入route。我学到的是route 给了我id 的价值(因为我是这样配置它的),除非我有一个相应的模型来捕获status(我作为http 正文传递),我无法获得status 的值。因此,您需要在操作定义中使用模型。
【解决方案2】:

啊,我想通了!

你必须传递一个模型。

public class fooModel
{
    public int status {get; set;}
}

动作应该重写如下:

public void unregister(int id, fooModel m)
{
    Debug.Print(m.status);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多