2012-01-11 76 views
1

所以我有以下工作:

$.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休息不兼容?

回答

2

不,这两者根本不相同。看看FireBug,Fiddler,...并比较两个请求。在第二个示例中,您没有设置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脚本来启用它。

+0

嗨达林,这是否意味着: $ .post('user',{“FirstName”:“John”,“LastName”:“Doe”}) 应该工作,因为我不再使用单引号.post期望一个json对象? – ymerej 2012-01-11 22:14:38

+0

@杰瑞米,我不明白你在问我什么。你在谈论'JSON.stringify'方法吗?你只能在'.ajax'中使用它,因为这允许你指定内容类型。用'$ .post'来使用它是没有意义的。我再说一遍:'$ .post'不允许你将请求的内容类型设置为'application/json'。如果没有这个HTTP请求头,服务器就不会收到您的请求。所以使用'$ .ajax'。就这么简单。忘掉这个'$ .post' =>这是为了执行'application/x-www-form-urlencoded'这样的请求,例如提交HTML表单和东西给ASPX页面。 – 2012-01-11 22:15:35

+0

我可以使用$ .ajax,但是我希望更快的速度和$ .post似乎是正确的答案(根据http://api.jquery.com/jQuery.post/),但我会坚持$ .ajax像你说的。谢谢。 – ymerej 2012-01-11 22:18:52