我有以下控制器,它应该接受用户名和密码作为POST中的有效负载。如果我把它改成HttpGet就行了。
[RoutePrefix("api")]
public class AccountController : ApiController
{
[HttpPost("login/{username}/{password}")]
[AcceptVerbs("POST")]
public Login Login(string username, string password)
{
Login login = new Login();
if (username == "user" && password == "pw") login.Success = true;
else login.Success = false;
return login;
}
}
OPTIONS请求可以通过,但POST失败。
OPTIONS标题:
OPTIONS响应:
POST标题:
POST回复:
知道我做错了吗?
答案 0 :(得分:14)
您已使用[HttpPost("login/{username}/{password}")]
定义了路线,但未在网址中发送用户名和密码,而是在请求正文中,因此您的路线不匹配,因此您获得了404。
因此您需要将路线更改为[HttpPost("login")]
本身它不起作用,因为使用Web.API你不能有来自请求体的多个动作参数,所以你需要一个复杂的类型:
public class LoginInfo {
public string username { get; set; }
public string password { get; set; }
}
因此,固定操作应如下所示:
[HttpPost("login")]
[AcceptVerbs("POST")]
public Login Login(LoginInfo loginInfo)
{
Login login = new Login();
if (loginInfo.username == "user" && loginInfo.password == "pw") {
login.Success = true;
} else {
login.Success = false;
}
return login;
}