Информация о среде: cli пакеты:
@ionic/cli-utils : 1.19.2
ionic (Ionic CLI) : 3.20.0
глобальные пакеты:
cordova (Cordova CLI) : 8.1.2 (cordova-lib@8.1.1)
локальные пакеты:
@ionic/app-scripts : 3.1.8
Cordova Platforms : ios 4.5.5
Ionic Framework : ionic-angular 3.9.2
Система:
ios-sim : 6.1.2
Node : v10.12.0
Npm : 6.4.1
OS : macOS High Sierra
Xcode : Xcode 9.4 Build version 9F1027a
Соответствующие плагины:
cordova-plugin-advanced-http 1.11.1
cordova-plugin-ionic-webview 1.2.1
@angular/http 5.0.3
@ionic-native/http 4.5.3
ionic-native-http-connection-backend 4.0.3
Мы пытаемся использовать http.post для отправки некоторых данных формы в формате json.Когда любая строка в этом json содержит символ «=», http.post, похоже, искажает ее.Сервер на другом конце получает тело сообщения только до точки символа «=», после чего ничего больше не остается.
Эта проблема возникает только с ios;Наш Android, Chrome и Windows строит все функции без проблем.Мы подозреваем, что это тесно связано с сочетанием плагинов cordova-plugin-ionic-webview и cordova-plugin-advanced-http и бэкэнда ionic-native-http-connection-backend, которые используются только на ios.Мы обновили наше приложение, чтобы использовать плагин webview для решения некоторых проблем производительности.Однако после переключения на эту библиотеку мы обнаружили, что она прерывает каждую сетевую транзакцию из-за проблем с CORS и других проблем, которые в конечном итоге приводят нас к использованию других библиотек, упомянутых в этом билете.
Вот упрощенный пример часа нашегоhttp почтовый индекс:
import {Headers, Http, RequestOptions, URLSearchParams} из '@ angular / http';
....
const post_payload = {
parameter: 'example = string'
};
const data = new URLSearchParams();
data.append('post', JSON.stringify(post_payload));
const options = new RequestOptions({
headers: headers,
withCredentials: true
});
this.http.post('https://example.url', data.toString(), options)
.subscribe(response => {
//handle response
}, (error) => {
//handle error
});
Почтовый запросзавершается, но тело сообщения отображается как: {post: {параметр: 'пример
Мы также попытались добавить post_payload непосредственно в data.append (), мы попытались полностью отказаться от URLSearchParams () и просто добавитьобъект post_payload напрямую и после того, как он был преобразован в строку, и мы также попытались отправить объект данных без toString ().
Вот как выглядит наш app.module.ts:
import {HttpModule, JsonpModule} из '@ angular / http';импортировать {NativeHttpFallbackD, NativeHttpModuleD} из 'ionic-native-http-connection-backend';импортировать {Http, RequestOptions} из поставщиков '@ angular / http';
…
: [DatePicker, StatusBar, SplashScreen, Device, {предоставить: ErrorHandler, useClass: IonicErrorHandler}, Camera,CameraPreview, File, FilePath, FileTransfer, MediaCapture, {предоставить: Http, useClass: Http, deps: [NativeHttpFallbackD, RequestOptions]}]
Я пытался довести все соответствующие плагины и библиотеки до самой последней версии,Я попытался удалить ionic-native-http-connection-backend (но это вызывает много проблем с CORS и приводит к тому, что http-вызовы не делят cookie-файлы с плагином передачи файлов, который сам по себе останавливается при замене, потому что мы не можем получить blob-объектпередача данных для работы).
Прямо сейчас я в растерянности, где продолжать искать.Наши сборки для Android и Windows просто не содержат нижнюю строку «обеспечить» в app.module.ts, и эти сообщения работают без проблем, что заставляет нас думать, что это - библиотека ionic-native-http-connection-backend, вызывающаявопрос.Однако мы не можем удалить эту библиотеку, потому что это единственное, что позволяет нашим запросам CORS успешно выполняться, когда мы используем cordova-plugin-ionic-webview, что в настоящее время является жестким требованием.