Ответ на предпечатную проверку имеет недопустимый код состояния 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-вызова к серверу, где в качестве предполетного режима используются два вызова.

Другие вопросы по тегам