Проект PhoneGap Ionic не выполняет $http.post на устройстве iOS

Я использую инфраструктуру Ionic для создания приложения html5, которое затем развертывается на устройстве iOS с помощью PhoneGap. Все работало отлично, затем мы переключили некоторые адреса серверов, которые использовались для получения данных, чтобы включить в адрес номер порта, а метод HTTP был переключен с GET на POST. После переключения мы протестировали локально в браузере, и он без проблем извлекал данные. Когда мы развернули на устройстве, мы ничего не увидели в журналах, когда запрос был выполнен, и обработчик успеха или ошибки так и не был достигнут. В приведенном ниже коде печатается только "HERE1" и все останавливается.

console.log("HERE1");
$http.post("http://XX.XX.XX.XX:81/api/Authenticate", null ,{ headers: {'Authorization': 'Basic ' + encodedNamePw} })
            .success(function (data, status, headers, config) {
                console.log("HERE2");
            })
            .error(function (data) {
                console.log("HERE3");
            });

Затем я попытался выполнить GET по тому же адресу и получил ответ, в котором говорилось, что у меня явно неправильный метод. Затем я попробовал POST по адресу без порта и получил ответ, который снова был ошибкой, но, по крайней мере, я получил ответ. Подводя итог, он работает локально в браузере, работает на устройстве iOS с запросом GET и PORT, но не делает никаких запросов, когда я использую метод POST. Я пытался избежать двоеточия, но это не помогло. Я довольно озадачен этим, поэтому любые мысли ценятся. Спасибо!


person KickerKeeper    schedule 03.11.2015    source источник
comment
Просто примечание. Я пробовал это и с Jquery, и у меня была такая же проблема.   -  person KickerKeeper    schedule 04.11.2015


Ответы (1)


После долгих мучений я нашел проблему и доступные варианты. Проблема заключалась в том, что мы получали ответ 401 и http-заголовок www-authenticate. Когда это отправляется сервером, очевидно, iOS пытается открыть диалоговое окно входа в систему, которое блокируется PhoneGap. Вместо того, чтобы использовать метод обратного вызова ошибки, он просто съедает его, и вы никогда не получите никакой информации о том, что запрос выполнен.

Лучшее решение требует, чтобы у вас был доступ к серверу, на который вы звоните. Если вы это сделаете, и вы можете обновить ответ, чтобы не отправлять заголовок www-authenticate для ответов 401, тогда вы золотой, и он работает так, как ожидалось. Если вы не можете, у вас есть возможность установить для параметра async значение false в запросе. Этот подход будет блокировать пользовательский интерфейс, что не идеально, но может быть приемлемым, если это просто запрос на вход. Удачи.

person KickerKeeper    schedule 10.11.2015