#angularjs #google-chrome #http #post
#angularjs #google-chrome #http #Публикация
Вопрос:
Я пытаюсь опубликовать объект в своей службе rest с помощью angularjs. К сожалению, это не работает с браузером Chrome от Google. Firefox и Internet Explorer работают отлично!
У кого-нибудь есть идея, в чем может быть проблема?
Вот мой интерфейс -вызов:
$scope.saveAssignment = function (cap, aId, wId, hId) {
//all the parameters are strings
var postData = {
assignmentId: aId,
status: "CLOSED",
startDate: new Date(),
endDate: new Date(),
captionText: cap,
workerId: wId,
segment_Id: hId
};
var header ={
'Content-Type': 'application/json; charset=utf-8'
};
$http.post("https://localhost:8443/rest/v1/saveAssignment", postData, header)
.success(function (data, status, headers, config) {
console.log("IN SAVE ASSIGNMENTS - SUCCESS");
console.log(status);
})
.error(function (data, status, headers, config) {
console.log("ERROR!");
//As a response I get data = '' and status = 0
})
}
У меня возникает та же проблема, если я его развертываю (независимо от localhost или нет).
На стороне сервера (JPA) я принимаю вызов с:
@Path("saveAssignment")
public class SaveAssignment{
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response saveAss(String assJson) {
System.out.println("TEST");
......
......
}
Но даже оператор печати «TEST» не выполняется…
Обновить
Похоже, это должно быть проблемой CORS… Chrome отправляет только запрос ОПЦИИ вместо POST… Идея, как это исправить? Я уже пробовал
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
но без успеха … : (
ОБНОВЛЕНИЕ 2
К сожалению, мне все еще не удается заставить его работать. Итак, я нашел обходной путь, сознательно исключив пользователей с браузером Chrome из этого сообщения на моей странице (т. Е. просмотра всей страницы)… (Я использовал его для Amazon Mechanical Turk, так что это не так серьезно). Но это не решение проблемы происхождения … 🙁
Чтобы исключить пользователей с браузером Google Chrome, я добавил следующее:
$scope.chrome;
$scope.setIsChrome = function(){
var chromium = window.chrome;
var vendorName = window.navigator.vendor;
if(chromium !== null amp;amp; vendorName === "Google Inc.") {
$scope.chrome = true;
} else {
$scope.chrome = false;
}
}
Вы должны дополнительно проверить имя поставщика, поскольку браузер Opera также возвращает true для «window.chrome»…
Комментарии:
1. Какая вкладка сети в Chrome dev tools говорит?
2. не очень много … статус: (отменен) тип: application / json; кодировка=UTF-8 —————————————— [..] Принять: приложение / json, текст / обычный, / Тип содержимого: application / json; кодировка =UTF-8 Источник: localhost: 8443 /rest[…] Пользовательский агент: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit /537.36 (KHTML, как Gecko) Chrome / 35.0.1916.153 Safari / 537.36 Источник запроса Payloadview […]
3. Можете ли вы попробовать удалить «https:» из сообщения? Просто начните с «//localhost:8443/rest …».
4. к сожалению, страница зависит от https, поскольку она встроена в Amazon Mechanical Turk в виде iframe, и MTurk запрашивает, чтобы страница была https…
5. Нашли ли вы решение / обходной путь для этого? Дергаю себя за волосы с давних пор
Ответ №1:
Ваше приложение angular обслуживается через тот же HTTPS-сервер? Если localhost:8433
имеет самозаверяющий или не соответствующий сертификат, то это может быть вашей проблемой, поскольку Chrome обычно отображает страницу исключения безопасности в таком случае.
Просто откройте любой URL, начинающийся с https://localhost:8443/
, как обычную страницу, а затем подтвердите исключения безопасности. Это должно помочь.
Обновить:
Если вы используете iframe, то встроенная страница может быть ограничена изолированной средой: http://msdn.microsoft.com/en-us/hh563496.aspx
Комментарии:
1. хороший момент, но проблема не в этом, самозаверяющий сертификат работает нормально… и, как я уже сказал, при развертывании приложения поведение идентично… :/
2. Обслуживается ли ваше приложение angular через тот же HTTPS-сервер, что и AJAX?