2015-10-20 2 views
4

Я пытаюсь сделать вызов REST (POST) с помощью AJAX. Это мой 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. Ответ на запрос перед полетом не проходит проверку контроля доступа. Нет заголовка «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? Что я здесь делаю неправильно?

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

, если вам нужно передать данные JSON в вызов AJAX, необходимо указать тип содержимого как JSON/приложения, так что сервер знает, что вы пытаетесь отправить данные в формате JSON. Но это изменит тип контента по умолчанию для вызова, и вызов будет иметь право на предполетную проверку, для которой необходим правильный клиент CORS с запросом &.

Для удобства использования не используйте JSON.stringify() при передаче данных, просто создайте простую строку с форматом {key: value, key: value, ...} и передайте строку как данные , Ajax-вызов сериализует данные по умолчанию и делает правильные вещи, и вызов остается как один вызов POST на сервер, где в качестве предполетного режима два вызова.

Смежные вопросы