【问题标题】:MVC Web Api not getting called from javascript ajax未从 javascript ajax 调用 MVC Web Api
【发布时间】:2013-08-29 12:27:22
【问题描述】:

我有一个正在尝试连接的 Durandal/热毛巾测试应用。我有以下 ajax 调用,但出现 404 错误。

GET http/.../api/Pizza/GetPizzasByOrderId?%22a8926610-a713-494c-bb15-46f6487a01c7%22 404(未找到)

我可以手动将网址更改为:

http/.../api/GetPizzasByOrderId?orderId=a8926610-a713-494c-bb15-46f6487a01c7

它有效。 但我想知道为什么另一个调用不起作用,或者更多,为什么 ajax 将 URL 中的参数弄乱了,而不是像复杂对象那样处理数据。 我有一个很好的获取和保存。 get 的参数为零,save 传入了一个复杂的对象。

C# Web API 控制器:

public class PizzaController : ApiController
{
    [HttpGet]
    public IEnumerable<Pizza> GetPizzasByOrderId(Guid orderId)
    {
        return DATA.GetPizzasByOrderId(orderId);
    }
}

JAVASCRIPT:

var dataCall = $.ajax(config.getPizzasByOrderIdUrl, {
    data: ko.toJSON(orderId),
    type: "get",
    contentType: "application/json"
});

我应该将我的 JavaScript 代码更改为以下内容并完成它还是有更好的方法与 Api 对话?

var getPizzasByOrderId = function (orderId) {
    return Q.when($.getJSON(config.getPizzasByOrderIdUrl + "?orderId=" + orderId));
};

【问题讨论】:

    标签: asp.net-mvc jquery knockout.js asp.net-web-api durandal


    【解决方案1】:

    您可以使用最后一个代码块中的代码,也可以传入一个对象来代替您的 orderId,如下面的代码块中所示。无论哪种方式,不同之处在于 orderId 参数被命名。

    var dataCall = $.ajax({
      url: config.getPizzasByOrderIdUrl,
      type: "GET",
      data: {orderId : orderId},
    });
    

    关于为什么 $.ajax() 可以很好地用于您的 POST,您可以通过运行这两段代码并查看通过网络传输的请求来轻松检查这一点。我建议使用谷歌浏览器。

    1. 加载已加载 jQuery 的页面
    2. 打开开发者工具并进入控制台
    3. 输入以下代码sn-p

      $.ajax("", { 数据:{orderId:123}, 类型:“获取”, 内容类型:“应用程序/json” });

    4. 切换到网络标签并点击以 ?orderId=123 结尾的标签

    5. 请注意,它确实将数据附加为查询字符串参数
    6. 在上面的 sn-p 中,将“get”替换为“post”
    7. 按 Enter 后,您应该会在开发者工具的网络选项卡上看到另一个请求。
    8. 请注意,当只更改请求类型时,数据会从查询字符串移动到正文。如 cmets 中所述,WebApi 将从请求正文中提取并使用模型绑定器填充复杂对象。

    【讨论】:

    • 这是正确的。 ASP.NET WebApi 根据 HTTP 谓词、命名参数及其数据类型选择控制器操作。如果其中任何一个错误,它将返回 404。
    • 您的代码块不起作用。它尝试在 orderId 周围加上引号并引发 400 错误。将 toJson 放在单个参数周围是没有意义的。
    • 这就是让我感到困惑的地方。我知道如果我像上面那样指定参数(没有 toJson 部分)它会起作用。但是如果你看这个答案。 stackoverflow.com/questions/14507101/… ...为什么不用我把参数放在那个里面??当 Web.Api 只是一个参数而不是一个复杂的对象时,它看起来像 Web.Api 的行为不同?
    • 是的,基于我在上面评论中所说的三件事,WebApi 的行为有所不同。在 GET 请求中,WebApi 默认假定您的参数位于 URI 中,尤其是当您的参数是值类型(字符串、int 等)时。如果您的参数是一个对象,WebApi 期望它位于请求的主体中,除非您在控制器中使用 [FromUri] 装饰参数。另一个参数装饰器是[FromBody],它告诉 WebApi 在请求正文中查找参数。
    • 是的,抱歉,不应该有 ko.toJSON()。我会编辑它。
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2016-07-14
    相关资源
    最近更新 更多