Отправка GET запроса из Android приложения

155
21 марта 2022, 06:20

Стоит задача, чтобы отправить на сервер запрос и получить с него ответ в виду json. Пытался найти информацию в интернете, но попадались лишь готовые решения, без какого-либо объяснения.

Можете подсказать с объяснением, как правильно сделать подобный запрос на сервер? Желательно, с дальнейшим чтением json.

Answer 1

Рекомендую научиться использовать связку Retrofit2 + RxJava2. Для начала потребуются следующие зависимости

implementation 'com.squareup.retrofit2:converter-gson:?.?.?'
implementation 'io.reactivex.rxjava2:rxjava:?.?.?'
implementation 'io.reactivex.rxjava2:rxandroid:?.?.?'
implementation 'com.squareup.retrofit2:adapter-rxjava2:?.?.?'

Создаем модель. Собственно это данные которые нам и нужны В данной связке Ответ будет автоматически разобран согласно модели.

public class User {
  @SerializedName("login")  \\Имя соответствует такому в json
  String login;
  @SerializedName("id")
  Integer id;
  @SerializedName("node_id")
  String nodeId;
  @SerializedName("avatar_url")
  String avatarUrl;
  @SerializedName("gravatar_id")
  String gravatarId;
  @SerializedName("url")
  String url;
  @SerializedName("html_url")
  String htmlUrl;

1) Создаем API

public interface GithubApi {
  @GET("users")
  Single<List<User>> getUsers(@Query("since") Integer since);
  // Если не использовать RxJava2CallAdapterFactory
  //  @GET("users")
  //  Call<List<User>> getMyUsers();

2) Создаем сервис

public class MyService {
  //  Создаем переменную API и BASE_URL
  private static final String BASE_URL = "https://api.github.com/";
  private GithubApi githubApi;
  //  Создаем конструктор
  public MyService() {
    Retrofit retrofit =
        new Retrofit.Builder()
            .baseUrl(BASE_URL)
            //  body (String) будет кастоваться к объектам через Gson
            .addConverterFactory(GsonConverterFactory.create())
            //  Вместо Call будет использоваться RxJava объекты Observable или Single
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
    //  Инициализируем переменную через ретрофит.
    githubApi = retrofit.create(GithubApi.class);
  }
  public Single<List<User>> userRequest(Integer since) {
    return githubApi.getUsers(since);
  }
 // Если не использовать RxJava2CallAdapterFactory
 //  public Call<List<User>> getMyUsers() {
 //    return githubApi.getMyUsers();
 //  }
}

3) Создаем презентер

public class MainPresenter {
  MyService myService;
  Listener listener;
  CompositeDisposable disposable = new CompositeDisposable();
  MainPresenter(Listener listener) {
    this.myService = new MyService();
    this.listener = listener;
  }
  public void userRequest(Integer since) {
    disposable.add(
        myService
            .userRequest(since)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                users -> {
                  listener.usersReceived(users);
                },
                throwable -> {
                  throwable.printStackTrace();
                }));
    // Если не использовать RxJava2CallAdapterFactory
    //    myService.getMyUsers().enqueue(new Callback<List<User>>() {
    //      @Override
    //      public void onResponse(Call<List<User>> call, Response<List<User>> 
    //      response) {
    //
    //      }
    //
    //      @Override
    //      public void onFailure(Call<List<User>> call, Throwable t) {
    //
    //      }
    //    });
  }
  public void clearDisposables() {
    if (!disposable.isDisposed()) {
      disposable.dispose();
    }
  }
  public interface Listener {
    void usersReceived(List<User> users);
  }
}

4) В активити или фрагменте вызываем так

mainPresenter =
    new MainPresenter(
        new MainPresenter.Listener() {
          @Override
          public void usersReceived(List<User> users) {
            // Здесь реагируем на получение данных и что угодно с ними делаем.
            Toast.makeText(getApplicationContext(), new Gson().toJson(users), 
            Toast.LENGTH_LONG)
                .show();
          }
        });
READ ALSO
Как в vue сделать задержку

Как в vue сделать задержку

У меня на форме создания пользователяПри отправка срабатывает вызов обновления списка пользователя но запрос выполняется быстрее чем запись...

135
Как переделать условие для *слово?

Как переделать условие для *слово?

Есть условие которое проверяет название заголовка, и если оно выполняется - выводит на экран:

66
Определить кол-во дней между датами

Определить кол-во дней между датами

Задана некая дата в формате timestamp, например 1581624000, нужно понять сколько дней осталось до этой даты

120
Обрезка части строки с условиями

Обрезка части строки с условиями

Здраствуйте нужна помощь, есть задача обрезать начало текста где есть № но при этом еще проверять длину строки, есть:

81