Android studio авторизация в приложении через базу на сервере
В этой главе мы собираемся объяснить, как вы можете интегрировать PHP и MYSQL с вашим Android-приложением. Это очень полезно, если у вас есть веб-сервер, и вы хотите получить доступ к его данным в приложении для Android.
MYSQL используется в качестве базы данных на веб-сервере, а PHP используется для извлечения данных из базы данных. Наше приложение свяжется со страницей PHP с необходимыми параметрами, а PHP свяжется с базой данных MYSQL, получит результат и вернет его нам.
Создание базы данных
База данных MYSQL может быть легко создана с помощью этого простого скрипта. Оператор CREATE DATABASE создает базу данных.
Создание таблиц
Как только база данных создана, пришло время создать несколько таблиц в базе данных. Оператор CREATE TABLE создает базу данных.
Вставка значений в таблицы
Когда база данных и таблицы созданы. Теперь пришло время вставить некоторые данные в таблицы. Оператор Insert Into создает базу данных.
PHP также используется для извлечения записи из базы данных mysql после ее создания. Чтобы получить запись, на страницу PHP необходимо передать некоторую информацию о том, какую запись нужно извлечь.
Подключение через метод Get
Подключение через почтовый метод
Последнее, что вам нужно сделать, это записать эти данные по ссылке. После записи вам необходимо открыть поток, чтобы получить ответные данные.
пример
Приведенный ниже пример является полным примером подключения вашего приложения для Android к базе данных MYSQL через страницу PHP. Он создает базовое приложение, которое позволяет войти в систему, используя метод GET и POST.
<? php $con = mysqli_connect ( "mysql10.000webhost.com" , "username" , "password" , "db_name" ); if ( mysqli_connect_errno ( $con )) < echo "Failed to connect to MySQL: " . mysqli_connect_error (); >$username = $_POST [ 'username' ]; $password = $_POST [ 'password' ]; $result = mysqli_query ( $con , "SELECT Role FROM table1 where Username='$username' and Password='$password'" ); $row = mysqli_fetch_array ( $result ); $data = $row [ 0 ]; if ( $data ) < echo $data ; >mysqli_close ( $con ); ?>Android часть
Чтобы поэкспериментировать с этим примером, вам нужно запустить его на реальном устройстве, к которому подключен интернет Wi-Fi.
меры | Описание |
---|---|
1 | Вы будете использовать IDE Android Studio для создания приложения Android и назовите его PHPMYSQL в пакете com.example.phpmysql. |
2 | Измените файл src / MainActivity.java, чтобы добавить код активности. |
3 | Создайте файл src / SiginActivity.java, чтобы добавить код PHPMYSQL. |
4 | Измените XML-файл макета. Res / layout / activity_main.xml добавьте любой компонент GUI, если это необходимо. |
5 | Измените файл res / values / string.xml и добавьте необходимые строковые компоненты. |
6 | Измените AndroidManifest.xml, чтобы добавить необходимые разрешения. |
7 | Запустите приложение и выберите работающее устройство Android, установите на него приложение и проверьте результаты. |
Вот содержимое src / com.example.phpmysql / MainActivity.java .
Вот содержимое файла src / com.example.phpmysql / SigninActivity.java .
Добавьте следующий контент в build.gradle и пересоберите весь проект.
Вот содержание activity_main.xml .
Вот содержимое Strings.xml .
Вот содержимое AndroidManifest.xml .
Давайте попробуем запустить ваше приложение PHPMYSQL. Я предполагаю, что вы подключили свое фактическое мобильное устройство Android к компьютеру. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок из панели инструментов. Перед запуском приложения Android Studio отобразит следующее окно, чтобы выбрать опцию, в которой вы хотите запустить приложение Android.
В этом уроке мы продолжим увеличивать свои способности в настройке пользовательского интерфейса своих приложений и оборудовать их все более серьезными вещами. На этот раз мы оснастим свое Android приложение функцией входа в приложение по вводу логина и пароля. Это может пригодится для многих приложений, да и просто интересно, как это делается. Все довольно просто, ничего сложного в реализации этой возможности не будет.
Здесь пригодится вспомнить простенький урок о переходе между двумя экранами, этот прием встречался уже неоднократно, поэтому разъяснений по нему делать уже не буду.
Создаем новый проект, выбираем Blank Activity. Для начала создадим пользовательский интерфейс для приложения. Он будет состоять из полей ввода логина/пароля и кнопки для совершения входа. Открываем файл activity_main.xml и добавляем туда следующее:
Мы получили вот такой вид пользовательского интерфейса:
Сразу разберемся со вторым экраном, на который будет совершаться переход в случае успешного ввода логина и пароля. Создаем новый класс по имени Second.java:
И соответствующий ему layout файл по имени second_activity.xml:
Кстати, не забудьте добавить вторую activity в файл манифеста AndroidManifest.xml:
Проверяем работоспособность своего творения:
Вот так, все отлично работает, теперь мы можем сделать свое приложение насколько крутым, что им смогут пользоваться только знающие данные логина и пароля для входа.
На днях мне пришлось подключится к внешней БД MySQL в Android приложении, которое бы использовало ресурсы готового сервиса, так вот в данном уроке я покажу как я это сделал.
В данном уроке мы с вами сделаем простое Android-приложения, который будет вызывать PHP скрипт для выполнения основных CRUD (Create, Read, Update, Delete) операций.
Android приложение будет вызывать PHP скрипт, который будет подключается к базе данных MySQL и выполнить какие то операции.
Что вам потребуется?
1) WEB-сервер для PHP. Будем использовать сборку DenWer.
2) MySQL база данных.
3) Android Emulator.
Шаг 1. Установка WEB-сервера.
После того как вы его установили и проверили, что он работает, переходим к следующему шагу.
Шаг 2. Создание БД
Так как мы подняли WebServer Denwer в нем уже вшита MySQL база данных, давайте создадим базу и таблицу (products) в ней.
Создание таблиц в БД:
В конце видео создания БД я не зря показал локальный IP, так как я использую виртуальную ОС для удобства. В вашем случае вы будите обращаться к localhost или же 127.0.0.1 .
Шаг 3. Подключение к MySQL базе с помощью PHP
Шаг 4. Базовые CRUD операции в PHP
В этом уроке я покрываю основные CRUD (Create, Read, Update, Delete) операций для MySQL с помощью PHP.
Запись строки в БД
Создадим в нашем PHP проекте новый файл create_product.php который будет обеспечивать возможность записи продукта в БД.
Для приведенного выше кода JSON ответ будет примерно таким:
Когда POST параметр(ы) отсутствует:
Когда продукт успешно добавлен:
Когда ошибка при добавлении данных в БД:
Чтение строки с БД
Создадим новый PHP файл в нашем проекте и назовем его get_product_details.php со следующим содержанием:
Ответ JSON для вышеупомянутого файла будет следующим.
При успешном получении продукта:
Когда продукт не найден:
Получение всех продуктов с БД
Для того чтобы вывести весь список продуктов на устройство нам нужно получить все продукты с БД.
Создадим get_all_products.php со следующим содержимым:
JSON ответ выше приведенного кода будет таким:
Когда продукт не найден:
Обновление продукта в БД
Создайте файл с именем update_product.php со следующим содержимым:
Ответ JSON выше кода, когда продукт успешно обновлены будет следующим:
Удаление продукта с БД
Последняя операция удаления из базы данных. Создайте новый файл назовите delete_product.php и вставьте следующий код:
Когда продукт удачно будет удален то JSON ответ будет таким:
Когда продукт не найден, то таким:
Теперь наконец-то мы можем приступить к программированию на Android. То что мы описали выше на PHP будем использовать как API слой. И наше приложение будет общаться с MySQL сервером по средством JSON формата и GET, POST запросов.
Статья является продолжением работы, о которой писал в своём предыдущем посте. Изначально эту часть писать не хотелось (см. предупреждение), но на хабре данная тема ещё не освещена, и в целом в сети меньше информации.
Поэтому, если Вам интересно, как можно из под Android напрямую работать с MS SQL (логично предположить, что и с другими БД, но на практике я этого не делал), добро пожаловать под кат.
В Java (и Android соответственно) соединение с удалёнными БД происходит при помощи JDBC-драйверов. В моём конкретном случае сервер майкрософтовский, и для него существует два драйвера: от Microsoft и открытая альтернатива JTDS. Причём последний, по заверениям разработчиков, работает быстрее и стабильней официального. Вот его и будем использовать.
На SQL-сервере должна быть настроена работа через TCP/IP.
Получение данных
Данные запросов драйвер возвращает в интерфейсе ResultSet который похож на андроидный Cursor, но быстрого способа приведения ResultSet к курсору я не нашёл. Поэтому поступим по-другому, данные из ResultSet будут конвертироваться в массив JSONArray и возвращаться в основную логику приложения, откуда с ними можно будет делать что угодно.
Весь обмен данными, как потенциально продолжительную операцию, будем делать асинхронно. В итоге получается примерно такой симпатичный класс для запросов к MS SQL:
EDIT: Переписал закрытие Connection, Statement и ResultSet в примерах в соответствии с основами.
На вход классу подаётся запрос, на выходе — готовый JSONArray, как если бы мы получали данные от веб-сервера. В отдельном потоке AsyncTask соединяется с сервером, получает данные в ResultSet и формирует из них JSON. Думаю, в целом код примитивен и в пояснениях не нуждается.
Для построения систем, работающих по подобному принципу, лучше передавать на вход не чистые select-запросы, а написать на сервере готовые T-SQL функции, передавая параметры к которым, можно получать нужные выборки.
Insert и Update. Передача данных на сервер
К сожалению, тут я не придумал ничего лучше, просто выполнение Insert-ов в транзакции. В прочем, метод отлично работает, вставка нескольких сотен записей занимает приемлемое время (около секунды на 100 строк, полей в реальном проекте больше, чем в приведённом примере).
EDIT: по совету eyeless_watcher использую метод addBatch() при заполнении PreparedStatement. Вот теперь вставка данных выполняется на самом деле быстро, в одной транзакции. Пример изменил.
Для вставки нужных значений используется PreparedStatement. Нумерация полей в нём почему-то начинается с единицы (см. документацию). А в остальном — всё должно быть понятно. update можно реализовать схожим образом, аналогично используя executeUpdate.
Приведённый подход был использован мной в «боевом» приложении первый раз.
На практике оказалось, что он стабильно работает. Время соединения с БД иногда может занимать несколько секунд (подключаюсь по wi-fi, сервер общий на всё предприятие), но сами транзакции выполняются быстро.
Во-первых я понял что для логина в приложение андроид используется две библиотеки либо retrofit либо volley, я лично думаю что буду делать на retrofit так как по нем больше информации и видосов.
Во-вторых у меня возникла идея, а что если не использовать эти все библиотеки и просто сделать перегон данных с формы в json и отправки на сервер по запросу?? Ну это так чисто как вариант, я просто сильно в этом пока разбираюсь))
В-третьих, я прошерстил кучу сайтов и пересмотрел кучу гайдов, и во всех случаях каждый из разработчиков создает кучу классов для обычного логина, и вот у меня вопрос нужно ли создавать кучу классов или можно сделать все как-то более компактно. Просмотрев кучу сайтов у меня так и не получилось сделать логин, даже на локальной БД.
И вот у меня есть теперь заминка при разработке авторизации в приложении, может кто-то сможет мне на очень простом языке как сделать логин при помощи retrofit , а то я никак не могу понять.
И так согласно первому комментарию и вопросам которые в нем были заданы: у меня есть свой сервер со своим api а именно rest api. Авторизация будет производится путем ввода пароля и лоигна которые будут вытягиваться с формы и отсылаться на сервер для проверки если все введено правильно то переход на другое активити. Уже есть база пользователей которые будут логиниться. Авторизация по популярным соц. сетям пока не берется во внимание. Передача данных на сервер пока идет в формате json но потом вроде как планируется и передавать методом post. Других способов аутентификации я думаю в ближайшем будущем не будет. Бэкендом занимаюсь не я и мне уже дали тестовый пароль и логин, а так-же кучу всяких деталей по серверной части, типа запросов и основных ошибок.
Буду очень благодарен за советы и помощь.
16.6k 10 10 золотых знаков 20 20 серебряных знаков 40 40 бронзовых знаковбуду делать на retrofit так как по нем больше информации и видосов
Не лучший ход мыслей.
во всех случаях каждый из разработчиков создает кучу классов для обычного логина
Но чаще пользуются Retrofit . Почему? Потому что он очень удобен.
Чуть позже, когда помимо вопросов как написать тоже самое, но на десять строчек кода короче , и вообще когда помимо количества строчек кода или внешней простоты реализации для вас появятся ещё какие-нибудь пункты, соответствие которым будет для вас весомым, вы поймёте, почему по Retrofit «куча видосов» — отчасти, из-за некоторой общей популярности, потому что работа с сетью у всех и ассоциируется с Retrofit , — но и популярность пришла не зря.
Затем создаём интерфейс для работы с API:
Далее вам нужно десериализованный POJO для ответа от сервера написать, и всё:
На этом «куча классов» закончилась. Удобно, разве нет? Теперь вызываем:
Итого — у вас в коде пара строчек потрачено на логику по работе с сетью, и помимо этого ещё пара коротеньких файлов. Это я ещё не говорил про тестирование, DI и так далее.
Самое главное — не делайте ничего бездумно, не копируйте первый попавшийся код потому что он «короче», «выглядит проще» или потому что «по нему видосиков куча».
Если к делу — о какой конкретно авторизации идёт речь? У вас свой API, или же вы хотите встроить авторизацию через популярные сервисы вроде VK , Google , Facebook и всё такое прочее?
В первом случае всё зависит от протоколов и способов аутентификации. Что вы используете: OAuth , накостыленная передача логинов и паролей прямо в теле запроса, Bearer -токены?
Во втором случае обычно используются SDK этих сервисов и вручную ничего не пишут. Но иногда (как например в случае с VK ), готовые SDK крайне убогие или не обновлялись много лет и приходится писать вручную — тогда чаще всего одними запросами вы не отделаетесь, вам придется юзера самого заставить тыкать на кнопочки, предоставленные сервисом, и скорее всего через WebView .
Если же всё-таки вы всё делаете вручную, и бэкенд тоже ваш, тогда логика тоже довольно проста — в случае с Retrofit — создаёте интерфейс (вроде написанного выше MyExampleApi ), помещаете туда методы с нужными сигнатурами, и выстраиваете свою логику. Юзер вводит пароль, или вы как-то сами его получаете, — вместе с логином шифруете его как-нибудь, или просто так отправляете в теле запроса — делаете обычный запрос с нужными заголовками, телом или query , и на основе ответа от сервера решаете, залогинился юзер или нет.
В общих словах всё выглядит просто. Ваш вопрос довольно развёрнутый, но не содержит конкретики — мой ответ тоже развёрнут и содержит всю необходимую информацию и даже сравнение. Больше конкретики по самой авторизации я не могу на данный момент написать, потому что конкретика вопроса не позволяет.
UPD:
Передача данных на сервер пока идет в формате json но потом вроде как планируется и передавать методом post.
А как вы планируете json передавать не через POST , в query как параметр при GET -запросе? Есть некоторые случаи такой логики, например при подписи запросов, но я сомневаюсь, что у вас это используется, а значит вам нужен именно POST -запрос.
Инициализация выглядит также. Интерфейс будет примерно такой:
Вот ваше тело запроса:
Оно будет автоматически сериализовано в JSON с помощью GSON:
Допустим, вот ваш JSON-ответ от сервера:
Тогда ваш десериализованный класс может выглядеть так:
Это будет сделано автоматически GSON -ом, т.к. вы добавили GsonConverterFactory в билдере при инициализации ретрофита.
Допустим, из ваших двух EditText по нажатию на кнопку вы получаете логин и пароль юзера:
Тело запроса сформировано. Теперь проинициализируем интерфейс для работы с API:
И теперь обрабатываем ответ:
Вот, собственно, и вся логика.
Ваше тело запроса AuthRequestBody будет сериализовано в JSON, почитайте про то, как это работает, в частности про библиотеку GSON.
Читайте также:
- Как узнать когда выпущена карта сбербанка через приложение сбербанк
- Как называется приложение onedrive для ведения блокнота или записной книжки
- Как добавить видео в яндекс видео с телефона
- Устройство подключено к драйверу который не поддерживается приложением magician
- Как сделать невидимое название приложения