使用 Get 调用 Web API 2 可以,但使用 Post 失败
Calling Web API 2 with Get is OK but fails with Post
我可以使用 get
从 static html form
调用 Web Api 2
,如下所示。
网页API:
public class WebServiceController : ApiController
{
[HttpGet]
[Route("api/WebService")]
public IHttpActionResult Post(string FirstName, string Surname)
{
//work
return StatusCode(HttpStatusCode.OK);
}
}
HTML 表格:
<form action="http://localhost:27020/api/WebService/" method="get">
<input type="text" name="FirstName" id="FirstName" />
<input type="text" name="Surname" id="Surname" />
<input type="submit" />
</form>
当我使用 method="post"
和 [HttpPost]
从 get
切换到 post
请求时,我在 Chrome 上得到下面的屏幕截图:
我做错了什么?
WebAPI 无法独立读取每个方法参数。你必须封装它们:
public class WebServiceController : ApiController
{
[HttpGet]
[Route("api/WebService")]
public IHttpActionResult Post(MyRequest request)
{
//work
return StatusCode(HttpStatusCode.OK);
}
}
public class MyRequest
{
public string FirstName { get; set; }
public string Surname { get; set; }
}
更改网络 api 路由始终是一个好习惯
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
到
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
之后就不需要跟get put和post了,可以像MVC路由一样使用全名。例如。 http://yourhost/api/WebService/your_action.
我可以使用 get
从 static html form
调用 Web Api 2
,如下所示。
网页API:
public class WebServiceController : ApiController
{
[HttpGet]
[Route("api/WebService")]
public IHttpActionResult Post(string FirstName, string Surname)
{
//work
return StatusCode(HttpStatusCode.OK);
}
}
HTML 表格:
<form action="http://localhost:27020/api/WebService/" method="get">
<input type="text" name="FirstName" id="FirstName" />
<input type="text" name="Surname" id="Surname" />
<input type="submit" />
</form>
当我使用 method="post"
和 [HttpPost]
从 get
切换到 post
请求时,我在 Chrome 上得到下面的屏幕截图:
我做错了什么?
WebAPI 无法独立读取每个方法参数。你必须封装它们:
public class WebServiceController : ApiController
{
[HttpGet]
[Route("api/WebService")]
public IHttpActionResult Post(MyRequest request)
{
//work
return StatusCode(HttpStatusCode.OK);
}
}
public class MyRequest
{
public string FirstName { get; set; }
public string Surname { get; set; }
}
更改网络 api 路由始终是一个好习惯
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
到
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
之后就不需要跟get put和post了,可以像MVC路由一样使用全名。例如。 http://yourhost/api/WebService/your_action.