0

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

获取 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));
};
4

1 回答 1

1

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

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

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

  1. 加载已加载 jQuery 的页面
  2. 打开开发者工具,进入控制台
  3. 输入以下代码片段

    $.ajax("", { data: {orderId: 123}, type: "get", contentType: "application/json" });

  4. 切换到网络选项卡并单击以 ?orderId=123 结尾的选项卡

  5. 请注意,它确实将数据附加为查询字符串参数
  6. 在上面的代码段中,将“get”替换为“post”
  7. 点击回车后,您应该会在开发人员工具的网络选项卡上看到另一个请求。
  8. 请注意,当只更改请求类型时,数据会从查询字符串移动到正文。如评论中所述,WebApi 将从请求正文中提取并使用模型绑定器来填充复杂对象。
于 2013-08-26T23:44:50.300 回答