【问题标题】:WebApi routing - many POST methodsWebApi 路由 - 许多 POST 方法
【发布时间】:2016-06-28 19:01:23
【问题描述】:

我有 WebAPI 2 应用程序。如何指定 2 个或多个 POST 方法?

我有以下 WebApiConfig:

public static void Register(HttpConfiguration config)
{
    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    // Web API routes
    config.MapHttpAttributeRoutes();

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

和 API 控制器:

[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    [Route("Post1")]
    [HttpPost]
    public IQueryable<string> Post1(string str)
    {
        return null;
    }

    [Route("Post2")]
    [HttpPost]
    public IQueryable<string> Post2(int id)
    {
        return null;
    }
}

我打电话都不管用:

/api/books/post1

也没有

/api/books/post2

为什么以及如何解决?

更新:

问题已解决,问题在于简单类型作为参数。我收到 404 错误

Message=未找到与请求 URI 匹配的 HTTP 资源 'http://localhost:37406/api/books/post1'。

有要求:

POST http://localhost:37406/api/books/post1 HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8

{
    "str" : "Fffff"
}

和代码:

    [Route("Post1")]
    [HttpPost]
    public HttpResponseMessage Post1(string str)
    {
        return Request.CreateResponse();
    }


    [Route("Post2")]
    [HttpPost]
    public HttpResponseMessage Post2(int id)
    {
        return Request.CreateResponse();
    }

但它适用于复杂类型:

   [HttpPost]
   [Route("Post1")]
    public HttpResponseMessage Post1(Book book)
    {
        return Request.CreateResponse();
    }

    [HttpPost]
    [Route("Post2")]
    public HttpResponseMessage Post2(Book book)
    {
        return Request.CreateResponse();
    }



public class Book
{
    public int BookId { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string Genre { get; set; }
}

谢谢恩科西

更新 2:

但是当参数被标记为 [FromBody] 时它可以工作

    [Route("Post1")]
    [HttpPost]
    public HttpResponseMessage Post1([FromBody]string str)
    {
        return Request.CreateResponse();
    }


    [Route("Post2")]
    [HttpPost]
    public HttpResponseMessage Post2([FromBody]int id)
    {
        return Request.CreateResponse();
    }

(对于复杂类型是不必要的)。逻辑上,但路由错误混淆:)

【问题讨论】:

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


【解决方案1】:

摘自Attribute Routing in ASP.NET Web API 2

HTTP 方法

Web API 还根据请求的 HTTP 方法选择操作 (获取、发布等)。默认情况下,Web API 会查找不区分大小写的 与控制器方法名称的开头匹配。例如,一个 名为 PutCustomers 的控制器方法匹配 HTTP PUT 请求。

您可以通过使用任何 以下属性:

[HttpDelete]
[HttpGet]
[HttpHead]
[HttpOptions]
[HttpPatch]
[HttpPost]
[HttpPut]

以下示例将 CreateBook 方法映射到 HTTP POST 请求。

[Route("api/books")]
[HttpPost]
public HttpResponseMessage CreateBook(Book book) { ... }

例子:

public class Book {
    public int BookId{get;set;}
    public string Title{get;set;}
    public string Author{get;set;}
    public string Genre{get;set;}
}

[RoutePrefix("api/books")]
public class BooksController : ApiController
{
    // GET api/books
    [Route("")]
    public IEnumerable<Book> Get() { ... }

    // GET api/books/5
    [Route("{id:int}")]
    public Book Get(int id) { ... }

    // POST api/books
    [HttpPost]
    [Route("")]
    public HttpResponseMessage Post1(Book book) { ... }

    // POST api/books/alternate
    [HttpPost]
    [Route("alternate")]
    public HttpResponseMessage Post2(Book book) { ... }
}

Post1 的示例 POST 正文

POST http://localhost:35979/api/books HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8
Content-Length: 80

{
    "Title":"Scary Book",
    "Author":"John Doe",
    "Genre":"Horror" 
}

Post2 的示例 POST 正文

POST http://localhost:35979/api/books/alternate HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8
Content-Length: 85

{
    "Title":"Fantastic Book",
    "Author":"Jane Doe",
    "Genre":"Fantasy" 
}

【讨论】:

  • 是的。一旦他们的路径不冲突,你可以任意数量
  • 这两个帖子相互冲突以及使用的模板/路线。
  • @Nikosi 哪个冲突?似乎,它不适用于简单类型。
  • 它可以处理简单的类型。在参数上使用[FromBody][FromUrl] 属性让框架知道在哪里寻找参数。检查Parameter Binding in ASP.NET Web API。你会看到你在哪里犯了错误
  • [FromBody] 一起工作。花了 3 个小时在这种微不足道的事情上 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多