【问题标题】:Making a $.post call with jquery 1.7.1 to a WCF rest service使用 jquery 1.7.1 对 WCF 休息服务进行 $.post 调用
【发布时间】:2012-01-11 21:06:46
【问题描述】:

所以我有以下工作:

$.ajax({
    type: 'POST',
    url: 'user',
    data: '{"FirstName":"John","LastName":"Doe"}',
    contentType: "application/json",
    dataType: 'json',
    success: function (data) {
        alert('success!' + data.Id);
    }
});

但是这失败了(应该是等效的):

$.post('user', '{"FirstName":"John","LastName":"Doe"}');

知道有什么问题吗? $.post 是否与 WCF 休息不兼容?

【问题讨论】:

    标签: c# jquery wcf rest post


    【解决方案1】:

    不,两者根本不等价。使用 FireBug、Fiddler 等查看并比较 2 个请求。在第二个示例中,您没有设置 contentType: "application/json" 请求标头。您没有设置它,因为 $.post 方法不允许您这样做。

    并且服务器不接受您的请求,因为由于您尝试 POST 到启用 JSON 的服务,它希望请求是 JSON,当然客户端设置 application/json 内容类型请求标头。您正在发布一些字符串,并且由于您没有通过内容类型标头指示该字符串代表什么,因此服务器不知道如何处理它并丢弃请求。

    这就是说您应该像第一个示例中那样使用$.ajax 来调用您的服务。实际上,我建议您稍作修改,而不是:

    data: '{"FirstName":"John","LastName":"Doe"}',
    

    使用:

    data: JSON.stringify({"FirstName":"John","LastName":"Doe"}),
    

    这将确保如果明天您决定与 Mr. Jon Doe 以外的其他人打交道,例如 Mr. Jon O"Hara,您的 JSON 仍将被正确编码,这正是 JSON.stringify 方法所做的。它原生内置于现代浏览器中,但如果您需要支持一些旧版浏览器,您可以包含 json2.js 脚本来启用它。

    【讨论】:

    • 嗨达林,这是否意味着: $.post('user', {"FirstName":"John","LastName":"Doe"}) 应该可以工作,因为我不再使用单引号和 .post 需要一个 json 对象?
    • @Jeremy,我不明白你在问我什么。您是在谈论JSON.stringify 方法吗?您应该仅将其与 $.ajax 一起使用,因为它允许您指定内容类型。与$.post 一起使用是没有意义的。我再说一遍:$.post 不允许您将请求的内容类型设置为application/json。如果没有此 HTTP 请求标头,服务器将不会接受您的请求。所以使用$.ajax。就这么简单。忘记这个$.post => 那是为了处理application/x-www-form-urlencoded 请求,例如向ASPX 页面提交HTML 表单和内容。
    • 我可以使用 $.ajax,但我希望有更简写的东西,并且 $.post 似乎是正确的答案(根据api.jquery.com/jQuery.post),但我会坚持使用 $.ajax 之类的你说。谢谢。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多