3

可悲的是,我无法获得使用 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 有什么问题?

4

4 回答 4

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;
}
于 2013-08-25T00:36:29.233 回答
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

应该很好地适应这些变化。

于 2013-08-25T00:31:46.317 回答
0

如果您使用超过 1 个参数,则 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 提示一样将参数封装到类中

} 希望能帮助到你 ;)

于 2015-07-27T09:13:04.167 回答
0

POST 动作只能有 1 个正文...无法发送 2 个正文(在您的情况下为 2 个字符串)。因此,WebAPI 解析器希望在 URL 中而不是在正文中找到它。您可以通过放置属性并设置一个参数来自 URL 而另一个来自正文来解决它。通常,当方法中只有一个对象参数时 - 不需要属性 [FromBody]。字符串应该在 URL 中。

所以 - 你可以尝试在 URL 中将它们作为参数发送(就像你在 GET 中所做的那样)或者 - 构建一个类来包装它。

我强烈建议使用 POST 进行登录操作。

于 2016-05-16T09:34:03.397 回答