Сервер на Python + клиент Android

Пример сервера на flask

Для выполнения запросов к серверу из Android приложения будем использовать библиотеку retrofit.  Для этого:

1. Добавим зависимости в build.gradle (уровня модуля) в раздел dependencies

implementation 'com.squareup.retrofit2:retrofit:2.9.0'

implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

2. Добавим разрешения на подключение в AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>

3. Файл activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

   xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical"

   tools:context=".MainActivity">


   <EditText

       android:hint="login"

       android:id="@+id/login_et"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"/>


   <EditText

       android:hint="password"

       android:id="@+id/password_et"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"/>


   <Button

       android:text="Отправить"

       android:id="@+id/send_button"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"/>


</LinearLayout>

4. Файл ActivityMain.java

package com.example.myapplication;


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;



import retrofit2.Callback;

import retrofit2.Response;

import retrofit2.Retrofit;

import retrofit2.Call;

import retrofit2.converter.gson.GsonConverterFactory;

import retrofit2.http.Body;

import retrofit2.http.GET;

import retrofit2.http.POST;



public class MainActivity extends AppCompatActivity {

   // Тут нужно написать адрес сервера

   public static final String serverURL = "http://192.168.0.79";


   public static class ResponseMessage{

       // Класс, в экземпляр которого будет преобразована строка, полученная от сервера

       public String status, message;

   }


   public static class LoginRequest{

       public LoginRequest(String login, String password) {

           this.login = login;

           this.password = password;

       }


       String login, password;

   }


   // Интерфейс для обращения к серверу, содержащий 3 метода.

   public interface UserService{

       /* Метод для регистрации на сервере.

       На сервер отправит экземпляр класса LoginRequest,

       преобразованный в JSON. Например, если в метод передать объект, созданный как

       `new LoginRequest("nikita", "123")`. То получим следующий JSON:

       {

           login: "nikita",

           password: "123"

       }

        */

       @POST("/registration") // метод и маршрут для отправки

       // `@POST` - аннотация, говорящая что будет отправлен запрос методом post

       // запрос будет отправлен методом post по адресу `http://192.168.0.79/registration`

       // `@Body` - аннотация, говорящая retrofit что нужно включить loginRequest в тело post-запроса

       Call<ResponseMessage> registerUser(@Body LoginRequest loginRequest);


       @POST("/authentication")

       Call<ResponseMessage> authUser(@Body LoginRequest loginRequest);


       @GET("/logout") //

       Call<ResponseMessage> logoutUser();

   }


   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);


       EditText loginEditText = findViewById(R.id.login_et);

       EditText passwordEditText = findViewById(R.id.password_et);

       Button sendButton = findViewById(R.id.send_button);


       sendButton.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View view) {

               String login = loginEditText.getText().toString();

               String password = passwordEditText.getText().toString();

              

               // Создаем объект retrofit

               Retrofit retrofit = new Retrofit.Builder()

                       .baseUrl(serverURL) // адресс сервера

                       // фабрика для преобразования строк-ответов от сервера в объекты и наоборот

                       .addConverterFactory(GsonConverterFactory.create())

                       .build();

              

               // retrofit сам реализует интерфейс `UserService`

               UserService userService = retrofit.create(UserService.class);

              

               // call - объект, инкапсулирующий логику отправки запросов

               // вызываем нужный метод объекта, реализующего наш интерфейс

               Call<ResponseMessage> call =

                       userService.authUser(new LoginRequest(login, password));

              

               // отправка запроса асинхронно

               call.enqueue(new Callback<ResponseMessage>() {

                   @Override

                   public void onResponse(

                           Call<ResponseMessage> call,

                           Response<ResponseMessage> response

                   ) {

                       // тут пишем что должно произойти когда придет ответ от сервера

                       if (response.isSuccessful() && response.body() != null) {

                           Toast.makeText(

                                   getApplicationContext(),

                                   response.body().message,

                                   Toast.LENGTH_SHORT

                           ).show();

                       } else{

                           Toast.makeText(

                                   getApplicationContext(),

                                   "Что-то пошло не так",

                                   Toast.LENGTH_SHORT

                           ).show();

                       }

                   }


                   @Override

                   public void onFailure(Call<ResponseMessage> call, Throwable t) {


                   }

               });

           }

       });

   }


}