Сервер на 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) {
}
});
}
});
}
}