我在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时,它就像一个魅力!这是相同的屏幕截图:
但是当我尝试从不同的域(即localhost:80)访问它时,它失败了,而且令人惊讶的是,它发出了一个GET而且我还得到了一个登录服务器的日志文件, REST资源不支持GET方法。这是同样的屏幕:
从我在互联网上看到的内容(特别是here,好文章!),跨域请求应该首先发出一个OPTIONS请求(缓存以供以后使用。)我的情况出了什么问题?
我尝试使用FireFox的插件RESTClient调用其他服务使用相同的参数,我能够成功调用其余服务(POST方法),所以这主要是ajax部分的问题。
帮我解决这个问题!并且知道我是否需要分享更多细节。
PS:在@A之后。 Wolff建议,我将数据从jsonp更改为json,现在我的浏览器发出了OPTIONS,但之后它没有发送实际的POST请求!!!答案 0 :(得分:0)
嗯,还有一些挖掘,我找到了解决方案!
更改后A. Wolff建议,浏览器发出OPTIONS请求并收到200响应,但之后实际的POST请求没有发送到服务器。
问题是,如果您发送任何特定标头,在我的情况下为“Content-Type”,则服务器必须在响应的“Access-Control-Allow-Headers”字段中添加该标头(OPTIONS请求的响应)。我更改了服务器端代码以在响应头中填充该字段,以及VOILA!
希望这对其他人也有帮助!
快乐编码。