【问题标题】:Cross Origin ajax "POST" request failing跨域 ajax“POST”请求失败
【发布时间】:2015-01-28 14:44:17
【问题描述】:

我有一个在 localhost:8080 上运行的 web 服务(REST),要调用我使用这个 jquery 代码的 web 服务:

jQuery.ajax({
        type: "POST",
        url: "http://localhost:8080/user/register",
        data: '{"name": "' + name + '","email": "' + email + '","password": "' + password + '"}',
         beforeSend: function(x) {
              if(x && x.overrideMimeType) {
               x.overrideMimeType(jsonMimeType);
              }
             },
        dataType:"jsonp",
        Accept : "application/json",
        contentType: "application/json",
        success: registerUser_success_callback,
        error: registerUser_error_callback
    });

当我尝试从同一个域(即 localhost:8080)调用这个 javascript 时,它就像一个魅力!这是相同的屏幕截图:

但是当我尝试从不同的域(即 localhost:80)访问相同的域时,它失败了,令人惊讶的是,它不是 POST,而是发出一个 GET 并且我还在我的服务器的日志文件中得到一个日志,说REST 资源不支持 GET 方法。这是相同的屏幕:

根据我在互联网上阅读的内容(尤其是here,很棒的文章!),跨域请求应首先发送一个 OPTIONS 请求(缓存以供以后使用。)我的情况出了什么问题?

我曾尝试使用 FireFox 的插件 RESTClient 以相同的参数调用其余服务,我能够成功调用其余服务(POST 方法),所以这主要是 ajax 部分的问题。

帮我解决这个问题!如果我需要分享更多细节,请让我知道。

PS:@A 之后。 Wolff 建议,我将数据类型从 jsonp 更改为 json,现在我的浏览器发送了 OPTIONS,但之后它并没有发送实际的 POST 请求!!!

【问题讨论】:

  • 由于 jsonp 的性质,您不能将 POST 方法与 jsonp 一起使用
  • 感谢@A.Wolff 的快速回复!你能更详细地解释一下吗?还是网络链接?
  • 可以看到这个问题:stackoverflow.com/questions/4508198/…希望对你有帮助!
  • 谢谢!只是好奇,如果请求来自同一个域,为什么它会起作用? @A.Wolff
  • 不应该。同样,POST 方法无法创建脚本标记客户端,这是 jsonp 的工作方式。但是使用CORS,你不应该使用jsonp,尝试使用json代替

标签: javascript jquery ajax rest cors


【解决方案1】:

好吧,再挖一些,我找到了解决方案!

在 A. Wolff 建议的更改之后,浏览器正在发送一个 OPTIONS 请求并收到 200 响应,但在该实际 POST 请求之后没有发送到服务器。

问题是,如果您发送任何特定的标头,在我的情况下是“Content-Type”,服务器必须在响应的“Access-Control-Allow-Headers”字段中添加该标头(OPTIONS 请求的响应)。我更改了服务器端代码以填充响应标头中的该字段,然后瞧!

希望这对其他人也有帮助!

快乐编码。

【讨论】:

猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2017-12-27
  • 2012-05-10
相关资源
最近更新 更多