#angular #cors #ionic4
#угловой #cors #ionic4
Вопрос:
Я немного новичок в ionic и angular и пытаюсь выяснить, как отправить простой HTTP-запрос на удаленный сервер в обход CORS. Мое первоначальное решение состояло в том, чтобы сделать это:
this.httpClient.get<MyObj>("/api");
И затем я создал proxy.config.json с этим содержимым:
{
"/api": {
"target": "http://real-remote-host/",
"changeOrigin": true,
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
Это отлично работает, когда я выполняю ng serve
. Однако я перехожу к созданию Android APK с помощью ionic cordova build android
, а затем этот код больше не работает. Похоже, что прокси работает только при запуске через serve
команду, но не через build
команду. Я, конечно, должен что-то упускать, поскольку простой HTTP-запрос не может быть таким сложным.
Кроме того, удаленный хост не может быть изменен, поэтому, пожалуйста, не предлагайте изменять, чтобы разрешить CORS с удаленного хоста.
Комментарии:
1. Правильно, прокси является частью сервера разработки webpack (см. Документы ) и не является частью выходных данных рабочей сборки.
2. Хорошо, итак, я могу выбросить решение proxy.config.json, поскольку оно не будет работать для производственной сборки. Есть ли какие-либо альтернативы?
Ответ №1:
Мне удалось найти решение, чтобы заставить это работать на Android. Он основан на этом руководстве, предоставленном Ionic:https://ionicframework.com/docs/native/http . Однако их статья далека от завершения.
Самое большое, чего не хватает в руководстве, — это того, что вам нужно включить HTTP в качестве поставщика в свой модуль приложения angular.
import { HTTP } from "@ionic-native/http/ngx";
...
@NgModule(
...
providers: [
...
HTTP
...
]
...
)
...
Вторая проблема, с которой я столкнулся, заключалась в том, что он продолжал говорить «plugin_not_installed». Это потому, что так получилось, что я вызывал this.http.get()
до того, как он был готов к использованию. Чтобы решить эту проблему, мне нужно было:
...
this.platform.ready().then(() => {
this.http.get(...);
});
...
Поскольку служба REST, которую я использовал, является HTTP, а не HTTPS, и поскольку я ориентируюсь на SDK 28 , мне нужно было включить этот фрагмент в мой config.xml . Главное, что для Usescleartextraffic должно быть установлено значение true в AndroidManifest.xml файл.
...
<platform name="android">
...
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
...
</platform>
...
Также обратите внимание, что это решение не работает для браузера, поэтому вам придется использовать ранее упомянутое решение proxy.config.json для целей тестирования. Вы можете использовать this.platform.is("android")
, чтобы проверить, Android ли это. Я не могу проверить, будет ли это работать должным образом на ios, но на странице плагина указано, что он поддерживает Android и ios.