How to use retrofit android

Retrofit

A type-safe HTTP client for Android and Java

Introduction

Retrofit turns your HTTP API into a Java interface.

The Retrofit class generates an implementation of the GitHubService interface.

Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.

Use annotations to describe the HTTP request:

  • URL parameter replacement and query parameter support
  • Object conversion to request body (e.g., JSON, protocol buffers)
  • Multipart request body and file upload

API Declaration

Annotations on the interface methods and its parameters indicate how a request will be handled.

Request Method

Every method must have an HTTP annotation that provides the request method and relative URL. There are eight built-in annotations: HTTP , GET , POST , PUT , PATCH , DELETE , OPTIONS and HEAD . The relative URL of the resource is specified in the annotation.

You can also specify query parameters in the URL.

URL Manipulation

A request URL can be updated dynamically using replacement blocks and parameters on the method. A replacement block is an alphanumeric string surrounded by < and >. A corresponding parameter must be annotated with @Path using the same string.

Query parameters can also be added.

For complex query parameter combinations a Map can be used.

Request Body

An object can be specified for use as an HTTP request body with the @Body annotation.

The object will also be converted using a converter specified on the Retrofit instance. If no converter is added, only RequestBody can be used.

Form Encoded and Multipart

Methods can also be declared to send form-encoded and multipart data.

Form-encoded data is sent when @FormUrlEncoded is present on the method. Each key-value pair is annotated with @Field containing the name and the object providing the value.

Multipart requests are used when @Multipart is present on the method. Parts are declared using the @Part annotation.

Multipart parts use one of Retrofit ‘s converters or they can implement RequestBody to handle their own serialization.

Header Manipulation

You can set static headers for a method using the @Headers annotation.

Note that headers do not overwrite each other. All headers with the same name will be included in the request.

A request Header can be updated dynamically using the @Header annotation. A corresponding parameter must be provided to the @Header . If the value is null, the header will be omitted. Otherwise, toString will be called on the value, and the result used.

Similar to query parameters, for complex header combinations, a Map can be used.

Headers that need to be added to every request can be specified using an OkHttp interceptor.

Synchronous vs. Asynchronous

Call instances can be executed either synchronously or asynchronously. Each instance can only be used once, but calling clone() will create a new instance that can be used.

On Android, callbacks will be executed on the main thread. On the JVM, callbacks will happen on the same thread that executed the HTTP request.

Retrofit Configuration

Retrofit is the class through which your API interfaces are turned into callable objects. By default, Retrofit will give you sane defaults for your platform but it allows for customization.

Читайте также:  Carstream auto для android auto не показывает

Converters

By default, Retrofit can only deserialize HTTP bodies into OkHttp’s ResponseBody type and it can only accept its RequestBody type for @Body .

Converters can be added to support other types. Six sibling modules adapt popular serialization libraries for your convenience.

  • Gson: com.squareup.retrofit2:converter-gson
  • Jackson: com.squareup.retrofit2:converter-jackson
  • Moshi: com.squareup.retrofit2:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire
  • Simple XML: com.squareup.retrofit2:converter-simplexml
  • JAXB: com.squareup.retrofit2:converter-jaxb
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

Here’s an example of using the GsonConverterFactory class to generate an implementation of the GitHubService interface which uses Gson for its deserialization.

Custom Converters

If you need to communicate with an API that uses a content-format that Retrofit does not support out of the box (e.g. YAML, txt, custom format) or you wish to use a different library to implement an existing format, you can easily create your own converter. Create a class that extends the Converter.Factory class and pass in an instance when building your adapter.

Download

The source code to the Retrofit, its samples, and this website is available on GitHub.

Maven

Gradle

Retrofit requires at minimum Java 8+ or Android API 21+.

R8 / ProGuard

If you are using R8 the shrinking and obfuscation rules are included automatically.

ProGuard users must manually add the options from retrofit2.pro.

You might also need rules for OkHttp and Okio which are dependencies of this library.

Contributing

If you would like to contribute code you can do so through GitHub by forking the repository and sending a pull request.

When submitting code, please make every effort to follow existing conventions and style in order to keep the code as readable as possible. Please also make sure your code compiles by running ./gradlew build (or gradlew.bat build for Windows).

Before your code can be accepted into the project you must also sign the Individual Contributor License Agreement (CLA).

Источник

Изучаем Retrofit 2

В мире Android разработки существует множество интересных библиотек, и сегодня мы рассмотрим детище компании Square — Retrofit. Что же это за зверь такой? Retrofit (согласно официальному сайту) — типобезопасный HTTP-клиент для Android и Java. Он является незаменимым инструментом для работы с API в клиент-серверных приложениях. Каких-то лет 5 назад Android-разработчикам для работы с сетью приходилось воротить горы кода с обратными вызовами, AsyncTask’ами и прочими «низкоуровневыми» вещами. И компания Square выпустила такую замечательную библиотеку — Retrofit.

В сети Интернет мне не удалось найти внятных туториалов по второй версии бибилиотеки, поэтому сегодня мы будем разбираться с ней на примере приложения, получающего посты с bash.im

Лучше один раз увидеть, чем сто раз услышать

Мы будем создавать приложение, получающее данные от API сайта Umorili, так как только они предоставляют данные с баша в удобном для парсинга виде. Вот так будет выглядеть конечный вариант:

Ну что, дети, вы готовы?

Зависимости

Библиотеку Retrofit можно подключить тремя способами: Gradle, Maven, Jar. Опишем каждый способ.

Gradle

В большинстве случаев для сборки приложений под Android используется именно этот инструмент, поэтому, если вы не уверены, берите этот вариант 🙂 (здесь и далее для зависимостей будут использоваться Gradle).

Для подключения в файл build.gradle модуля приложения в раздел dependencies вставляем строчку:

Maven

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

Не приветствую использование этого варианта, но некоторые любят его. Скачиваем с официального сайта jar-файл (ссылка) и кидаем его в папку libs.

Помимо самой библиотеки нам понадобится парсер JSON и RecyclerView-v7, поэтому подключим их:

С зависимостями разобрались, теперь перейдем к самой сладкой части — разработке. Перво-наперво нам нужно описать запросы к API, поэтому.

Читайте также:  Gmail app https android

Описание запросов к API

Retrofit позволяет сделать полноценный REST-клиент, который может выполнять POST, GET, PUT, DELETE. Для обозначения типа и других аспектов запроса используются аннотации. Например, для того, чтобы обозначить, что требуется GET запрос, нам нужно написать перед методом GET, для POST запроса POST, и так далее. В скобках к типу запроса ставится целевой адрес. Для примера возьмем API GitHub’а. Полный URL для получения списка репозиториев определенного пользователя можно представить в виде https://api.github.com/users/octocat/repos , где:

  • api.github.com — базовая часть адреса (всегда оканчивается слешем)
  • users//repos — метод (адрес документа, целевой адрес), где определенного пользователя (octocat) мы заменили на алиас (про использование алиасов чуть позже)

Еще существуют параметры запроса, например в запросе к Umorili мы будем использовать следующий адрес — https://umorili.herokuapp.com/api/get?name=bash&num=50 , где name=bash&num=50 — параметры.

Но одними аннотациями описание не заканчивается, нам же надо где-то их описать. А описываем мы их в интерфейсе (interface). Для нашего приложения интерфейс будет следующим:

Разберем этот интерфейс. У нас есть метод getData, возвращающий объект типа Call
> . Методы должны всегда возвращать объект типа Call и иметь аннотацию типа запроса (GET, POST, PUT, DELETE).

Аннотация @Query(«name») String resourceName показывает Retrofit’у, что в качестве параметра запроса нужно поставить пару name= .

Если у нас в целевом адресе стоит алиас, то для того, чтобы заместо алиаса поставить значение, нам нужно в параметрах функции написать @Path(» «) SomeType variable , где SomeType — любой тип (например, String, int, float).

PostModel — класс, сгенерированный сайтом jsonschema2pojo на основе ответа сервера.

Подготовка к запросу

Перед отправкой запроса и получением результата нам нужно произвести инициализацию Retrofit’а и объекта интерфейса. Чтобы приложение не имело сотню объектов, выполняющих одну и ту же функцию, мы произведем всю инициализацию в классе, унаследованном от Application. Код тогда будет следующим:

P.S. не забываем в манифесте прописать, что используем свой класс Application

Теперь из любого класса мы имеем доступ к API.

Получение данных

Мы можем выполнять запросы (и, следовательно, получать данные) двумя способами — синхронными а асинхронными запросами. Для синхронного (блокирующего) получения мы используем метод execute() у объекта типа Call. Для нашего примера код был бы следующим:

В результате выполнения мы получаем объект типа Response (ответ), откуда мы можем уже получить распарсенный ответ методом body() .

Для асинхронного получения мы заменяем execute() на enqueue() , где в параметрах передаем функции обратного вызова (колбэки). В нашем примере будет выглядеть примерно так:

Делаем отображение данных

Данные мы уже получили, а как и теперь отобразить? Кидаем в разметку активности RecyclerView и как-нибудь его обзываем. После этого создаем разметку для элемента.

Источник

Используем Retrofit 2 в Android-приложении

Retrofit — это известная среди Android-разработчиков библиотека для сетевого взаимодействия, некоторые даже считают её в каком-то роде стандартом. Причин для такой популярности масса: библиотека отлично поддерживает REST API, легко тестируется и настраивается, а запросы по сети с её помощью выполняются совсем просто. В этой статье я покажу вам, как настроить и использовать Retrofit, чтобы реализовать работу с сетью в вашем приложении.

Настройка Retrofit

Добавьте следующую зависимость в файл build.gradle :

Мы будем использовать Gson для преобразования JSON в POJO. Retrofit предоставляет зависимость, которая автоматически конвертирует JSON в POJO. Для этого добавьте ещё одну зависимость в файл build.gradle :

Если в вашем приложении ещё не разрешена работа с сетью, то обязательно добавьте соответствующуу строку в файл AndroidManifest :

После того, как зависимости добавлены, нам необходимо написать код для настройки библиотеки Retrofit.

Создайте класс с именем NetworkService :

Этот класс должен быть singleton-объектом, поэтому объявите статическую переменную и функцию, которая создаёт и возвращает переменную того же типа, что и класс. Если вы не знаете, как работает данный паттерн, то ознакомьтесь с этой статьёй, в которой есть примеры реализации на языке Java.

Для тестирования мы используем JSONPlaceholder, который предоставляет фейковый онлайн REST API для разработчиков:

Теперь мы объявим и инициализируем Retrofit в конструкторе NetworkService :

Настройка завершена, теперь нам нужно определить конечные точки, которые будут возвращать данные.

Добавление конечных точек

Создайте интерфейс с именем JSONPlaceHolderApi :

На сайте JSONPlaceHolder URL /posts/id — это конечная точка, которая возвращает сообщение с соответствующим идентификатором. Данная конечная точка принимает GET-запрос и возвращает данные в формате JSON в следующем виде:

Сначала мы создадим соответствующий POJO для JSON-ответа:

Как вы видите, это простой POJO-класс. Переменные мы аннотировали с помощью @SerializedName() , передав туда имя. Эти имена фактически являются ключами в возвращаемых из API JSON-данных, поэтому вы можете как угодно изменять имя переменной, но убедитесь, что имя, переданное в аннотацию @SerializedName() , точно присутствует в JSON.

В интерфейсе, созданном выше, определите конечные точки с требуемыми параметрами:

Поскольку мы отправляем GET-запрос, нам нужно применить к методу аннотацию @GET , внутри которой находится конечная точка, на которую мы хотим отправить запрос. Как вы видите, мы не добавляем полный URL, т.к. Retrofit автоматически возьмёт BASE_URL , переданный в класс NetworkService , и добавит его к остальной части URL-адреса.

Возвращаемый тип метода называется Call

. Call — это класс, предоставляемый непосредственно самой библиотекой. И все методы в интерфейсе должны возвращать значения этого типа. Это generic-класс, принимающий в себя тип объекта, который мы хотим конвертировать в JSON. Мы передали Post , т.к. это именно тот объект, в который хотим преобразовать JSON-ответ. В параметры мы передали целое число и аннотировали его с помощью @Path , внутри которого записали id . Retrofit возьмёт это значение и в конечной точке заменит на него . Таким образом, если мы передадим значение 1 в качестве параметра, то конечная точка будет выглядеть так — /posts/1 , если передадим значение 10, то конечная точка получится — /posts/10 .

Теперь нам нужно, чтобы Retrofit предоставил реализацию интерфейса JSONPlaceHolderApi . Для этого используем метод create() :

Далее нужно получить JSONPlaceHolderApi из NetworkService и отправить запрос:

Возвращённый объект Call содержит метод с именем enqueue , который принимает в качестве параметра Callback . В onResponse мы получаем результат Response

, содержащий возвращённый с сервера объект Post . Чтобы получаем сам объект Post , используем метод response.body() . Остальная часть кода понятна без дополнительных пояснений.

Отправка различных типов запросов

В API JSONPlaceHolder есть много разных конечных точек, которые можно использовать.

Получение списка сообщений

Для получения списка всех сообщений мы изменили конечную точку и возвращаемый тип функции.

Отправка запроса с параметром

Если вы хотите отправить запрос с параметром, то нужно всего лишь использовать аннотацию @Query() для соответствующего параметра в методе:

Поэтому если мы передадим значение 6 в параметре метода, то конечная точка будет следующей — /posts?userId=6 .

Отправка POST запроса

Для отправки POST-запроса нужно просто изменить аннотацию метода.

Чтобы сформировать тело запроса для данного метода, мы используем аннотацию @Body для передаваемого параметра. Retrofit будет использовать Gson для конвертации @Body в JSON.

Существует ещё несколько различных типов запросов, которые вы можете использовать, но это уже тема для отдельной статьи.

Перехват запросов

Retrofit предоставляет способ перехвата запросов и их логирования в Logcat. Давайте настроим перехватчик и посмотрим на эту магию. Добавьте следующую зависимость в файл build.gradle :

Обновите класс NetworkService таким образом:

Теперь, когда вы отправляете или получаете запрос, все его данные, включая URL, заголовки, тело, будут выведены в лог:

На этом наша статья заканчивается. Код для этого проекта вы можете найти на GitHub.

Источник

Читайте также:  Ассасин крид java для андроид
Оцените статью