Response for preflight has invalid HTTP status code 400
我正在尝试使用AJAX进行REST调用(POST)。这是我的AJAX代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); }); |
最初我收到此错误:XMLHttpRequest无法加载http:// localhost:port / service / myservice。对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头。因此不允许原点'null'访问。响应具有HTTP状态代码400。
要解决此问题,我在dropwizard应用程序中添加了以下代码
1 2 3 4 5 6 7 8 9 | 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
在做了更多调试后,我发现了这种行为。发送没有Authorization标头的请求时,我收到415(不支持的媒体类型)错误。
我认为我的AJAX代码有问题,有人可以帮我找到问题吗?谢谢。
你可以在这里尝试提到完整的答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 | $.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)); } }); |
如果需要在AJAX调用中传递JSON数据,则需要将内容类型指定为json / application,因此服务器知道您正在尝试发送JSON数据。 但这将改变呼叫的默认内容类型,并且呼叫将有资格进行飞行前检查,这需要适当的CORS启用客户端和服务器请求。
为了更简单的用例,在传递数据时不要使用JSON.stringify(),只需使用{key:value,key:value,...}格式创建一个简单的字符串,并将字符串作为数据传递。 Ajax调用默认情况下序列化数据并做正确的事情,并且调用保持为对服务器的单个POST调用,其中前置模式是两个调用。
尝试将以下内容添加到您的设置中?
1 | xhrFields: { withCredentials: true } |