Как отправить пользовательский заголовок в запросе POST в Android с помощью webview_flutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как отправить пользовательский заголовок в запросе POST в Android с помощью webview_flutter

Сообщение Anonymous »

В этой документации указано, что это невозможно сделать, поэтому я ищу альтернативное решение:

В настоящее время установка пользовательских заголовков при отправке запроса на публикацию с методом loadRequest WebViewController не поддерживается на Android. Если вам требуется эта функция, обходной путь — выполнить запрос вручную, а затем вместо этого загрузить данные ответа с помощью loadHtmlString.

Обходной путь, который они предоставляют, поставляется с свои проблемы. Метод loadHtmlString отображает только нестилизованную, не отвечающую страницу в элементе веб-просмотра со следующими ошибками консоли:

Код: Выделить всё

I/chromium(19539): [INFO:CONSOLE(286)] "Uncaught ReferenceError: $ is not defined", source: about:blank (286)
I/chromium(19539): [INFO:CONSOLE(636)] "Uncaught ReferenceError: jQuery is not defined", source: about:blank (636)
Вот моя реализация версии loadHtmlString. Я попытался загрузить jQuery, чтобы решить проблему с зависанием, но у меня нет сообщений, связанных с игнорируемыми таблицами стилей:

Код: Выделить всё

class _PortalWebviewState extends State
 {
late final WebViewController controller;

@override
void initState() {
super.initState();
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted);
_loadRequestWithAuthHeader();
controller.addJavaScriptChannel(
'Flutter',
onMessageReceived: (JavaScriptMessage message) {
print('JavaScript Error: ${message.message}');
},
);
}

Future injectJQuery() async {
await controller.runJavaScript('''
var script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.6.0.min.js';
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);
''');
}

Future _loadRequestWithAuthHeader() async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: 'token');
if (token != null) {
print("Token found in keychain.");
final url = Uri.parse('${Config.domain}/mobile_index.php');
final headers = {
'Authorization': 'Bearer $token',
'Content-Type': 'application/json',
};

try {
final response = await http.post(url, headers: headers);
print('Portal response status code: ${response.statusCode}');

if (response.statusCode == 200) {
await injectJQuery();
await controller.loadHtmlString(response.body);
} else {
print('Error: ${response.statusCode}');
// Handle error cases here
}
} catch (e) {
print('Error: $e');
// Handle exceptions here
}
} else {
print('Token not found');
}
}

@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true,
appBar: AppBar(
title: const Text('COMPANY NAME'),
actions: [
NavigationControls(controller: controller),
// Menu(controller: controller),
],
),
body: PortalWebviewStack(controller: controller),
);
}
Он возвращает нестилизованный HTML-код с неработающими ссылками, которые загружают пустые страницы — журналы моего сервера не показывают, что после нажатия ссылок в веб-просмотре были получены какие-либо запросы.
Я считаю, что отправка заголовка аутентификации как части запроса GET может быть более простым решением, но мне нравится безопасность POST, и я считаю, что этот обходной путь должен быть возможен в моем случае использования, поскольку на него есть ссылки в документах выше и в эта проблема с Github.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ew-flutter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»