【问题标题】:JQuery ajax JSONP POST changed to GET when cross domainJQuery ajax JSONP POST跨域时改为GET
【发布时间】:2012-05-18 06:20:08
【问题描述】:

我有一个等待 POST 的 WCF 服务。使用 Fiddler 我发现在跨域情况下,我的 POST 请求被更改为 GET,导致服务器出现错误 405。

$.ajax({
    type: "POST",
    url: "http://blah/blah.svc/Test",
    data: JSON.stringify("{ 'WebUserID': 4 }"),
    dataType: "jsonp",  // from server
    contentType: "application/json; charset=utf-8", // to server
    success: function (data, status, xhr) {
        alert("success--");
    }
});

有人能解释一下吗?

谢谢

【问题讨论】:

标签: wcf jquery jsonp


【解决方案1】:

没有 POST 和 JSONP。 JSONP 通过在 DOM 中创建一个新的脚本标签来工作,该标签向服务器发送 GET 请求。您给 jQuery.ajax 提供了两个不兼容的参数(POST、jsonp),而 jQuery 选择了另一个。

一个更新:您可以使用诸如 CORS(跨域资源共享)之类的东西来启用对跨域服务的非 GET 请求。 WCF 不支持开箱即用,但我在http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx 写了一篇关于在 WCF 中实现它的帖子。

【讨论】:

    【解决方案2】:

    它正在将其转换为 GET,因为在执行 JSON.stringify 之后您不再拥有名称/值对;你只有一个字符串。 POST 需要一个名称/值对。

    【讨论】:

    • 不要JSON.stringify你的数据,除非你打算传递一个对象的串行表示。
    • 他不应该字符串化,但不是因为你提到的。 stringify 的参数已经“字符串化”了,它不是一个 JS 对象(它是一个字符串)。字符串化将对其进行双重编码,这将失败。
    • 而要在 POST 请求中发送数据,他实际上需要传递对象的序列化版本(在请求正文中)。
    • 是的。我认为他真正的意思是:data: { WebUserId: 4 },。这就是我想说的。
    • 感谢您的意见,但我认为 carlosfigueira 是对的。我不认为它可以这样做。
    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2014-03-09
    • 2013-07-28
    • 2012-06-05
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多