Форум программистов, компьютерный форум, киберфорум
Программирование мобильных систем
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.09.2022
Сообщений: 12

Получить данные с формы WebView

07.06.2024, 06:44. Показов 817. Ответов 0

Студворк — интернет-сервис помощи студентам
Здравствуйте, столкнулся с проблемой. В приложение, написанное на C# Xamarin добавлен новый модуль, который реализуется посредством открытия веб-сайта через WebView, вход в профиль будет осуществляться при помощи логина и пароля, храниться они должны в локальной базе данных, чтобы была возможность авторизовываться автоматически. На странице регистрации пользователь заполняет данные логина и пароля, затем жмёт на кнопку "Зарегистрироваться".
В этом и заключается вопрос, как можно получить данные, заполненные пользователем.
Очевидным ходом является использование обработчика событий нажатия кнопки, однако нельзя получить значение после нажатия кнопки как, например, в WindowsForms, ибо Url страницы меняется и возможность обратиться к полям пропадает, значит нужно извлечь данные уже после отправки, распарсив POST-запрос, здесь и возникает ряд проблем:
ChatGPT выдает следующий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  private async Task Entrance()
        {
            if
            {
            }
            else
            {
                webView.Source = $"{TargetUrl}";
                Content = webView;
                webView.Navigated += OnWebViewNavigated;
            }
        }
 
        private void OnWebViewNavigated(object sender, WebNavigatedEventArgs e)
        {
            webView.EvaluateJavaScriptAsync(@"
                document.getElementsByName('signup-button')[0].addEventListener('click', function() {
                    const emailInput = document.getElementById('abiturientsignupform-email').value;
                    const passwordInput = document.getElementById('abiturientsignupform-password').value;
                    const isEmailInvalid = document.getElementById('abiturientsignupform-email').getAttribute('aria-invalid');
                    const isPasswordInvalid = document.getElementById('abiturientsignupform-password').getAttribute('aria-invalid');
                    const message = {
                        email: emailInput,
                        password: passwordInput,
                        isEmailInvalid: isEmailInvalid,
                        isPasswordInvalid: isPasswordInvalid
                    };
                    window.webkit.messageHandlers.invokeAction.postMessage(JSON.stringify(message));
                });
            ");
        }
 
        private void WebView_Navigating(object sender, WebNavigatingEventArgs e)
        {
            var uri = new Uri(e.Url);
            if (uri.Scheme == "invokeAction")
            {
                var query = uri.Query.TrimStart('?');
                var parameters = System.Web.HttpUtility.ParseQueryString(query);
 
                var email = parameters["email"];
                var password = parameters["password"];
                var isEmailInvalid = parameters["isEmailInvalid"];
                var isPasswordInvalid = parameters["isPasswordInvalid"];
 
                if (isEmailInvalid == "false" && isPasswordInvalid == "false")
                {
                    LoginButtonClicked(email, password);
                }
 
                e.Cancel = true; // Останавливаем переход по URL
            }
        }
 
        private async void LoginButtonClicked(string email, string password)
        {
            await TryAuthAsync2(email, password, true);
        }
 
        protected override void OnAppearing()
        {
            base.OnAppearing();
            webView.Navigating += WebView_Navigating;
            webView.Navigated += OnWebViewNavigated;
        }
 
        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            webView.Navigating -= WebView_Navigating;
            webView.Navigated -= OnWebViewNavigated;
        }
Как было выяснено методом проб и ошибок, приложение не терпит в коде присутствие webView.Navigated и после компиляции даже не открывается, даже одно только наличие этих строчек в коде, не вызывая их, крашит приложение,
Кликните здесь для просмотра всего текста
может ли быть проблема в XAML схеме?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:CustomNavigationBar="clr-namespace:Mobile.Views.Controls"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:effects="clr-namespace:Mobile.Effects"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:toolkit="http://xamarin.com/schemas/2020/toolkit"
    BackgroundColor="White"
    NavigationPage.HasNavigationBar="False"
    mc:Ignorable="d"
    x:Class="Mobile.Views.LKAbit.PersonalCabinetMainPage">
 
    <ContentPage.Effects>
        <effects:SafeAreaPaddingEffect />
    </ContentPage.Effects>
 
    <AbsoluteLayout
        CompressedLayout.IsHeadless="True"
        HorizontalOptions="FillAndExpand"
        VerticalOptions="FillAndExpand">
 
        <CustomNavigationBar:NavigationBarWithBackButton
            Title="Личный кабинет абитуриента"
            AbsoluteLayout.LayoutBounds="0, 0, 1, 56"
            AbsoluteLayout.LayoutFlags="XProportional,WidthProportional" />
 
        <WebView
            x:Name="webView"
            AbsoluteLayout.LayoutBounds="0, 56, 1, 1"
            AbsoluteLayout.LayoutFlags="All" />
    </AbsoluteLayout>
</ContentPage>


Но основная, как мне кажется, проблема этого кода в том, что он меняет Url веб-страницы, чтобы передать post-запрос.
Была ещё попытка передать POST-запрос сообщением:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    private void OnWebViewNavigated(object sender, WebNavigatedEventArgs e)
        {
            // Устанавливаем JavaScript код для отслеживания нажатия кнопки
            webView.EvaluateJavaScriptAsync(@"
                document.getElementsByName('signup-button')[0].addEventListener('click', function() {
                    const emailInput = document.getElementById('abiturientsignupform-email');
                    const passwordInput = document.getElementById('abiturientsignupform-password');
                    const isEmailInvalid = emailInput ? emailInput.getAttribute('aria-invalid') : 'true';
                    const isPasswordInvalid = passwordInput ? passwordInput.getAttribute('aria-invalid') : 'true';
                    const message = {
                        email: emailInput ? emailInput.value : '',
                        password: passwordInput ? passwordInput.value : '',
                        isEmailInvalid: isEmailInvalid,
                        isPasswordInvalid: isPasswordInvalid
                    };
                    window.ReactNativeWebView.postMessage(JSON.stringify(message));
                });
            ");
        }
Но здесь требуется React, не понимаю, можно ли подключить js библиотеку к C# коду и как её тогда использовать.

Последний из предложенных вариантов был наиболее похож на правду
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private async Task PostQueryAsync(string email, string password)
        {
            using (HttpClient httpClient = new HttpClient())
            {
                string url = $"{TargetUrl}";
                var postData = new Dictionary<string, string>
                {
                    { "abiturientsignupform-email", email },
                    { "abiturientsignupform-password", password }
                };
 
                HttpContent postContent = new FormUrlEncodedContent(postData);
                HttpResponseMessage response = await httpClient.PostAsync(url, postContent);
 
                response.EnsureSuccessStatusCode();
 
                string content = await response.Content.ReadAsStringAsync();
 
                Device.BeginInvokeOnMainThread(() =>
                {
                    webView.Source = new HtmlWebViewSource
                    {
                        Html = content,
                        BaseUrl = url
                    };
                });
 
                await TryAuthAsync2(email, password, true);
            }
        }
Подскажите, как правильно перехватить POST запрос, отправленный с веб-сайта через WebView с помощью C#

Если посоветуете использовать WebView2 или FiddlerCore, то
C#
1
using Microsoft.Web.WebView2
не работает, пакет NuGet скачивается, но в Microsoft нет расширения Web, а FiddlerCore нет среди NuGet пакетов, прочитал, что он вроде платный, не нашёл где скачать
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2024, 06:44
Ответы с готовыми решениями:

Qt creator. Есть файл aboutDialog.cpp/h с webview, как получить доступ к webview из mainWindow ?
aboutDialog.h #ifndef ABOUTDIALOG_H_ #define ABOUTDIALOG_H_ #include &lt;QtGui/QDialog&gt; #include &lt;QtCore/QUrl&gt; class...

Получить данные в поле текстбокса автоматом и перенести данные с формы на лист
Добрый день. Имеется таблица -реестр. Заполняется через форму. В поле текстбокса вводится номер транспортного средства и в текстбоксе2(...

CGI. Как получить данные из html формы и отослать данные клиенту в html формате?
Господа помогите с cgi. Никогда этого не делал под VB, а сейчас очень надо. Как получить данные из html формы и отослать данные клиенту в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.06.2024, 06:44
Помогаю со студенческими работами здесь

Получить данные от формы
Добрый день. Я что-то делаю не так, но не понимаю что, в итоге если в action стоит сторонний файл, то данные получить методом пост...

Получить данные из формы
Здравствуйте, помогите получить данные с сайта btc-e.com из таблицы цен только первую строчку

Получить данные из формы
Здравствуйте всем! Мы разрабатываем такой компонент: зарегистрированный пользователь может создавать свои сборники, в которые может...

Получить данные из формы
Есть форма &lt;form action=&quot;http://example.ru/&quot; target=&quot;myFrame&quot;&gt; &lt;input type=&quot;text&quot; value=&quot;123&quot;&gt; &lt;input type=&quot;submit&quot;&gt; &lt;/form&gt;...

Не удается получить данные из формы
Код html с формой: &lt;!DOCTYPE html&gt; &lt;html &gt; &lt;head&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
Облако проектов
russiannick 01.06.2025
Слава Джа, написал прогу для компиляции. Значит написал компилятор? Обьем кода 300+ строк. Язык-яву. Вводим данные, заполняем поля, тычем радиобаттоны. И по итогу в поле результат получам листинг. . .
Rust и квантовые вычисления: интеграция с Q# и Qiskit
golander 01.06.2025
Мир квантовых вычислений традиционно оставался закрытым клубом для высокоуровневых языков типа Python и специализированных DSL вроде Q#. Однако в последние годы Rust начал тихую революцию в этой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »