Я использую Ionic framework для создания приложения html5, которое затем развертывается на устройстве iOS с помощью PhoneGap. Все работало отлично, затем мы переключили некоторые серверные адреса, которые использовались для того, чтобы данные включали номер порта в адрес, а метод HTTP был переключен с GET на POST. После того, как коммутатор был протестирован локально в браузере, он без проблем загружал данные. Когда мы были развернуты на устройстве, мы ничего не увидели в журналах, когда запрос был выполнен, а обработчик успеха или ошибки не был достигнут. В приведенном ниже коде печатается только "ЗДЕСЬ1", и все останавливается.
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. Я пытался избежать толстой кишки, но это не помогло. Я довольно озадачен этим, поэтому любые мысли оцениваются. Благодарю!
После долгих страданий я обнаружил проблему и доступные варианты. Проблема заключалась в том, что мы получали ответ 401 и http-аутентификацию http-заголовка. Когда это отправляется сервером, очевидно, что iOS пытается открыть диалоговое окно входа в систему, которое заблокировано PhoneGap. Вместо того, чтобы использовать метод обратного вызова ошибки, он просто ест его, и вы никогда не получите никакой обратной связи, что запрос был завершен.
Лучшее решение требует, чтобы у вас был доступ к серверу, который вы вызываете. Если вы это сделаете, и вы можете обновить ответ, чтобы не отправлять заголовок www-authenticate для ответов 401, тогда вы являетесь золотым, и он работает так, как ожидалось. Если вы не можете, у вас есть возможность установить для параметра async значение false в запросе. Этот подход будет блокироваться в пользовательском интерфейсе, что не является идеальным, но может быть приемлемым, если это просто запрос на вход. Удачи.