2015-10-20 141 views
4

我正在尝试使用AJAX进行REST调用(POST)。这是我的AJAX代码预检的响应具有无效的HTTP状态代码400

<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。对预检请求的响应不会通过访问控制检查:请求的资源上不存在“访问控制 - 允许来源”标头。因此不允许原产地'null'访问。响应有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相关吗?我在这里做错了什么?

UPDATE

做更多的调试后,我发现这种行为。当发送没有授权标题的请求时,我收到415(不支持的介质类型)错误。

我认为我的AJAX代码有问题,有人可以帮我找到问题吗?谢谢。

回答

0

尝试将以下内容添加到您的设置中?

xhrFields: { withCredentials: true } 
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)); 
     } 
}); 
0

,如果你需要传递在AJAX调用JSON数据,你需要指定内容类型为JSON /应用程序,以便服务器知道你要发送JSON数据。但是这将改变呼叫的默认内容类型,并且该呼叫将有资格进行飞行前检查,这需要适当的启用CORS的客户端请求服务器&。

为了更简单的用例,在传递数据时不要使用JSON.stringify(),只需使用{key:value,key:value,...}格式创建一个简单字符串,并将该字符串作为数据传递。 Ajax调用默认情况下序列化数据并执行正确的操作,并且该调用保持为服务器的单个POST调用,其中,预飞行模式为两次调用。

相关问题