Ответ на предпечатную проверку имеет недопустимый код состояния HTTP 400
Я пытаюсь сделать вызов REST (POST), используя AJAX. Это мой код 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. Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение '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? Что я здесь не так делаю?
ОБНОВИТЬ
После дополнительной отладки я обнаружил это поведение. При отправке запроса без заголовка авторизации я получаю ошибку 415 (Unsupported Media Type).
Я думаю, что-то не так с моим кодом AJAX, может кто-нибудь, пожалуйста, помогите мне найти проблему? Благодарю.
3 ответа
Вы можете попробовать упомянуть здесь как полный ответ в этой теме.
$.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));
}
});
Попробуйте добавить следующее в свои настройки?
xhrFields: { withCredentials: true }
Если вам нужно передать данные JSON в вызове AJAX, вам нужно указать тип контента как json/application, чтобы сервер знал, что вы пытаетесь отправить данные JSON. Но это изменит тип содержимого вызова по умолчанию, и вызов будет соответствовать требованиям предполетной проверки, для которой требуется соответствующий запрос клиента и сервера с поддержкой CORS.
Для упрощения использования не используйте JSON.stringify() при передаче данных, просто создайте простую строку в формате {key:value, key:value, ...} и передайте эту строку в качестве данных. Вызов Ajax сериализует данные по умолчанию и делает все правильно, и этот вызов остается в виде одного POST-вызова к серверу, где в качестве предполетного режима используются два вызова.