WebApi 路由 - 许多 POST 方法
WebApi routing - many POST methods
我有 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=No HTTP resource was found that matches the request URI
'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();
}
(对于复杂类型是不必要的)。逻辑上,但是路由错误混淆了:)
摘自 Attribute Routing in ASP.NET Web API 2
HTTP Methods
Web API also selects actions based on the HTTP method of the request
(GET, POST, etc). By default, Web API looks for a case-insensitive
match with the start of the controller method name. For example, a
controller method named PutCustomers matches an HTTP PUT request.
You can override this convention by decorating the mathod with any the
following attributes:
[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) { ... }
}
样本 POST 正文 Post1
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"
}
样本 POST 正文 Post2
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"
}
我有 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=No HTTP resource was found that matches the request URI '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();
}
(对于复杂类型是不必要的)。逻辑上,但是路由错误混淆了:)
摘自 Attribute Routing in ASP.NET Web API 2
HTTP Methods
Web API also selects actions based on the HTTP method of the request (GET, POST, etc). By default, Web API looks for a case-insensitive match with the start of the controller method name. For example, a controller method named PutCustomers matches an HTTP PUT request.
You can override this convention by decorating the mathod with any the following attributes:
[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) { ... }
}
样本 POST 正文 Post1
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"
}
样本 POST 正文 Post2
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"
}