可悲的是,我无法获得使用WebAPI的最基本的东西
$.ajax({
url: "https://192.168.1.100/Api/Authentication/LogIn",
type: "POST",
contentType: "application/json",
data: "{ 'username': 'admin', 'password': 'MyPass' }",
error: function (r, s, e) { alert(e); },
success: function (d, s, r) { alert(s); }
});
我得到“未找到”
API控制器定义
public class AuthenticationController : ApiController
{
[HttpPost]
public bool LogIn(string username, string password)
{
return true;
}
}
如果我删除HttpPost并用HttpGet替换它,然后执行
$.ajax({
url: "https://192.168.1.100/Api/Authentication/LogIn?username=admin&password=MyPass",
type: "GET",
error: function (r, s, e) { alert(e); },
success: function (d, s, r) { alert(s); }
});
工作正常。
WebAPI出了什么问题?
答案 0 :(得分:6)
本文应该有助于回答您的一些问题。
http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
我相信这里的想法是,特别是在RESTful API中,您需要将数据绑定到特定方法处理的单个资源。因此,将数据推送到几个松散的参数并不是Web API所采用的那种用法。
处理发布数据时,您可以告诉您的操作方法正确绑定其参数:
public class LoginDto {
public string Username { get; set; }
public string Password { get; set; }
}
[HttpPost]
public bool LogIn(LoginDto login) {
// authenticate, etc
return true;
}
答案 1 :(得分:2)
一些事情。 Yahia的改变是有效的。此外,POST需要在WebAPI中有一点方向才能知道在哪里查找数据。我认为这很愚蠢。如果您知道它是POST,请查看邮件正文。无论如何,将POST改为此,事情就会奏效。该属性告诉WebAPI查看正文,模型进行绑定。
AuthModel只是一个包含用户名和密码属性的简单模型。由于WebApi希望绑定到输入的方式,这将使您的生活更轻松。
请阅读此处了解更多详情: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1
应该善于应对这些变化。
答案 2 :(得分:0)
如果使用多个参数,则WebAPI中的绑定不起作用。
虽然在MVC控制器中同样有效。
在WebAPI中,使用类来绑定两个或多个参数。阅读有用的文章:
http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
您可以通过以下方式解决:
1.在MVC动作中做同样的事情(它有效)
2.保持无参数发布和读取请求
[HttpPost]
[ActionName("login")]
public async Task<bool> Post()
{
var str= await Request.Content.ReadAsStringAsync();
//
3.将参数封装到类,如gyus提示
} 希望它有所帮助;)
答案 3 :(得分:0)
POST动作只能有1个身体...... 没有办法发送2个实体(在你的情况下是2个字符串)。 因此,WebAPI解析器希望在URL中找到它而不是在body中。 您可以通过放置属性并设置一个参数来自URL而另一个参数来自body来解决它。 通常,当方法中只有一个对象参数时 - 不需要属性[FromBody]。 字符串应该在URL中。
所以 - 您可以尝试将它们作为参数发送到URL中(就像您在GET中所做的那样) 或者 - 构建一个包装它的类。
我强烈建议您使用POST进行登录操作。