我正在尝试使用AJAX进行REST调用(POST)。这是我的AJAX代码
<script>
var settings = {
"async": true,
"crossDomain": true,
"dataType": "json",
"url": "http://localhost:port/service/myservice",
"method": "POST",
"data": '{jsondata}',
"headers": {
"accept": "application/json",
"Authorization": "authValue"
}
}
$.ajax(settings)
.done(function (response) {
console.log(response);
});
</script>
最初我收到此错误: XMLHttpRequest无法加载http://localhost:port/service/myservice。对预检请求的响应没有通过访问控制检查:否&#39;访问控制 - 允许 - 来源&#39;标头出现在请求的资源上。起源&#39; null&#39;因此不允许访问。响应的HTTP状态代码为400。
要解决此问题,我在dropwizard应用程序中添加了以下代码
Dynamic filter = env.servlets().addFilter("CORS", CrossOriginFilter.class);
filter.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS");
filter.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
filter.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
filter.setInitParameter("allowedHeaders", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
filter.setInitParameter("allowCredentials", "true");
filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
添加此内容后,我的初始异常消失,但我收到以下异常: XMLHttpRequest无法加载http://localhost:port/service/myservice。预检的响应包含无效的HTTP状态代码400
这个问题与CORS有关吗?我在这里做错了什么?
更新
进行更多调试后,我发现了这种行为。在没有授权标题的情况下发送请求时,我收到 415(不支持的媒体类型)错误。
我认为我的AJAX代码有问题,有人可以帮我找到问题吗?感谢。
答案 0 :(得分:1)
您可以在此主题中尝试here作为完整答案提及。
$.ajax({
type:"POST",
beforeSend: function (request)
{
request.setRequestHeader("Authority", authValue);
},
url: "http://localhost:port/service/myservice",
data: "json=" + escape(JSON.stringify(createRequestObject)),
processData: false,
success: function(msg) {
$("#results").append("The result =" + StringifyPretty(msg));
}
});
答案 1 :(得分:0)
尝试将以下内容添加到您的设置中?
xhrFields: { withCredentials: true }
答案 2 :(得分:0)
如果需要在AJAX调用中传递JSON数据,则需要将content-type指定为json / application,因此服务器知道您正在尝试发送JSON数据。但这将改变呼叫的默认内容类型,并且该呼叫将有资格进行飞行前检查,这需要适当的CORS启用客户端&amp;服务器请求。
为了更简单的用例,在传递数据时不要使用JSON.stringify(),只需使用{key:value,key:value,...}格式创建一个简单的字符串,并将字符串作为数据传递。 Ajax调用默认情况下序列化数据并做正确的事情,并且调用保持为对服务器的单个POST调用,其中前导模式是两次调用。