Cross Origin ajax" POST"请求失败

时间:2014-11-30 14:05:39

标签: javascript jquery ajax rest cors

我在localhost:8080上运行了一个web服务(REST)来调用web服务我使用这个jquery代码:

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时,它就像一个魅力!这是相同的屏幕截图: enter image description here

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

从我在互联网上看到的内容(特别是here,好文章!),跨域请求应该首先发出一个OPTIONS请求(缓存以供以后使用。)我的情况出了什么问题?

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

帮我解决这个问题!并且知道我是否需要分享更多细节。

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

1 个答案:

答案 0 :(得分:0)

嗯,还有一些挖掘,我找到了解决方案!

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

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

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

快乐编码。