- Retrofit
- A type-safe HTTP client for Android and Java
- Introduction
- API Declaration
- Request Method
- URL Manipulation
- Request Body
- Form Encoded and Multipart
- Header Manipulation
- Synchronous vs. Asynchronous
- Retrofit Configuration
- Converters
- Custom Converters
- Download
- Maven
- Gradle
- R8 / ProGuard
- Contributing
- Используем Retrofit 2 в Android-приложении
- Настройка Retrofit
- Добавление конечных точек
- Отправка различных типов запросов
- Получение списка сообщений
- Отправка запроса с параметром
- Отправка POST запроса
- Перехват запросов
- POST body JSON using Retrofit
- 1 Answer 1
- Использование Retrofit 2.x в качестве REST клиента — Tutorial
- 1.1. Что такое Retrofit
- 1.2. Использование Retrofit
- 2. Предварительные требования
- 3. Упражнение: Первый Retrofit клиент
- 3.1. Создание и настройка проекта
- 3.2. Определите API и Retrofit адаптер
- 4. Retrofit конвертеры и адаптеры
- 4.1. Retrofit конвертеры
- 4.2. Retrofit Адаптеры
- 5. Retrofit аутентификация
- 5.1. Аутентификация с аннотациями
- 5.2. Аутентификация с помощью OkHttp перехватчиков.
- 6. Упражнение: использование Retrofit для запроса к Gerrit в Java
- 6.1. Создание и настройка проекта
- 6.2. Определите API и Retrofit адаптер
- 7. Упражнение: использование Retrofit для конвертирования XML-ответа от RSS-канала
- 7.1. Создание и настройка проекта
- 7.2. Определяем XML представление
- 7.3. Определение API и Retrofit адаптера
- 8. Упражнение: Создание приложения для запроса к StackOverflow
- 8.1. Создание и настройка проекта
- 8.2. Создание модели данных
- 8.3. Создание activity и layout
- 8.4. Использование поддельного поставщика данных
- 8.5. Добавление Gradle зависимостей и разрешений
- 8.6. Определение API и Retrofit адаптера
- 8.7. Установка activity
- 8.8. Необязательно: получение изображения профиля пользователя
- 8.9. Необязательно: используйте разные layout’ы для четных и нечетных строк
- 8.10. Необязательно: Обработка ошибки сети
- 9. Упражнение: Использование Retrofit для доступа к GitHub API в Android
- 9.1. Настройка проекта
- 9.2. Определение API
- 9.3. Диалоговое окно «Создание учетных данных»
- 9.4. Создание Activity
- 10. Упражнение: использование Retrofit с OAuth для запроса сведений о пользователе из Twitter на Android
- 10.1. Настройка проекта
- 10.2. Определение API
- 10.3. Создание Activity
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.
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-приложении
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 возьмёт это значение и в конечной точке заменит на него
Теперь нам нужно, чтобы 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.
Источник
POST body JSON using Retrofit
I’m trying to POST a JSONObject using the Retrofit library, but when I see the request at the receiving end, the content-length is 0 .
In the RestService interface:
And it gets called with,
And I’m certain that the registrationBundle , which is a JSONObject isn’t null or empty (the other fields are certainly fine). At the moment the request is made, it logs out as: <"zip":19312,"useAccountZip":false,"controllerName":"mine","registrationCode":"GLD94Q">.
On the receiving end of the request, I see that the request has Content-type: application/json but has Content-length: 0 .
Is there any reason why sending JSON in the body like this isn’t working? Am I missing something simple in using Retrofit?
1 Answer 1
By default, you don’t need to set any headers if you want a JSON request body. Whenever you test Retrofit code, I recommend setting .setLogLevel(RestAdapter.LogLevel.FULL) on your instance of RestAdapter. This will show you the full request headers and body as well as the full response headers and body.
What’s occurring is that you are setting the Content-type twice. Then you’re passing a JSONObject, which is being passed through the GsonConverter and mangled to look like <"nameValuePairs":YOURJSONSTRING>where YOURJSONSTRING contains your complete, intended JSON output. For obvious reasons, this won’t work well with most REST APIs.
You should skip messing with the Content-type header which is already being set to JSON with UTF-8 by default. Also, don’t pass a JSONObject to GSON. Pass a Java object for GSON to convert.
Источник
Использование Retrofit 2.x в качестве REST клиента — Tutorial
1.1. Что такое Retrofit
Retrofit — это REST клиент для Java и Android. Он позволяет легко получить и загрузить JSON (или другие структурированные данные) через веб-сервис на основе REST. В Retrofit вы настраиваете, какой конвертер используется для сериализации данных. Обычно для JSON используется GSon, но вы можете добавлять собственные конвертеры для обработки XML или других протоколов. В Retrofit используется библиотека OkHttp для HTTP-запросов.
Вы можете создавать объекты Java на основе JSON, используя следующий инструмент: www.jsonschema2pojo.org Это может быть полезно для создания сложных структур данных Java из существующего JSON.
1.2. Использование Retrofit
Для работы с Retrofit вам понадобятся следующие три класса:
- Model класс, который используется как модель JSON
- Интерфейсы, которые определяют возможные HTTP операции
- Класс Retrofit.Builder — экземпляр, который использует интерфейс и API Builder, чтобы задать определение конечной точки URL для операций HTTP
Каждый метод интерфейса представляет собой один из возможных вызовов API. Он должен иметь HTTP аннотацию (GET, POST и т. д.), чтобы указать тип запроса и относительный URL. Возвращаемое значение завершает ответ в Call-объекте с типом ожидаемого результата.
Можно использовать замещающие блоки и параметры запроса для настройки URL-адреса. Замещающий блок добавляется к относительному URL-адресу с помощью <>. С помощью аннотации @ Path для параметра метода значение этого параметра привязывается к конкретному замещающему блоку.
Параметры запроса добавляются с помощью аннотации @ Query к параметру метода. Они автоматически добавляются в конце URL-адреса.
Аннотация @ Body к параметру метода говорит Retrofit использовать объект в качестве тела запроса для вызова.
2. Предварительные требования
В следующих примерах используется Eclipse IDE с системой сборки Gradle.
Это упражнение предполагает, что вы знакомы с Gradle и использованием Gradle с Eclipse.
Другие среды разработки, такие как Visual Studio Code или IntelliJ, позволяют сделать то же самое, так что вы можете использовать свой любимый инструмент.
3. Упражнение: Первый Retrofit клиент
В этом упражнении вы создадите автономный REST клиент. Ответы генерируются Mock-сервером.
3.1. Создание и настройка проекта
Создайте новый проект Gradle, с именем com.vogella.retrofitgerrit. Добавьте новый пакет в src/main/java с именем com.vogella.retrofitgerrit.
Добавьте следующие зависимости в файл build.gradle.
3.2. Определите API и Retrofit адаптер
В JSON ответе от Gerrit нас интересует только вопрос об изменениях. Поэтому создайте следующий класс данных в ранее добавленном пакете по умолчанию.
Определите REST API для Retrofit через следующий интерфейс.
Создайте следующий класс контроллера. Этот класс создает Retrofit клиент, вызывает Gerrit API и обрабатывает результат (выводит результат вызова в консоль).
Создайте класс с main-методом для запуска контроллера.
4. Retrofit конвертеры и адаптеры
4.1. Retrofit конвертеры
Retrofit может быть настроен на использование конкретного конвертера. Этот конвертер обрабатывает (де)сериализацию данных. Несколько конвертеров уже доступны для различных форматов сериализации.
- Для конвертации в JSON и обратно:
- Gson: com.squareup.retrofit:converter-gson
- Jackson: com.squareup.retrofit:converter-jackson
- Moshi: com.squareup.retrofit:converter-moshi
- Для конвертации в Protocol Buffers и обратно:
- Protobuf: com.squareup.retrofit:converter-protobuf
- Wire: com.squareup.retrofit:converter-wire
- Для конвертации в XML и обратно:
- Simple XML: com.squareup.retrofit:converter-simplexml
Помимо перечисленных конвертеров, вы также можете создавать собственные для обработки других протоколов путем расширения класса Converter.Factory.
4.2. Retrofit Адаптеры
Retrofit также может быть расширен адаптерами для взаимодействия с другими библиотеками, такими как RxJava 2.x, Java 8 и Guava.
Обзор доступных адаптеров можно найти на Github square/retrofit/retrofit-adapters/.
Например, адаптер RxJava 2.x можно подключить, используя Gradle:
или используя Apache Maven:
Чтобы добавить адаптер, необходимо использовать метод retrofit2.Retrofit.Builder.addCallAdapterFactory(Factory).
При использовании этого адаптера интерфейсы Retrofit могут возвращать типы RxJava 2.x, например, Observable, Flowable или Single и т. д.
5. Retrofit аутентификация
Retrofit поддерживает вызовы API, требующие аутентификации. Аутентификацию можно выполнить, используя имя пользователя и пароль (аутентификация Http Basic) или API токен.
Существует два способа управления аутентификацией. Первый метод — управлять заголовком запроса с помощью аннотаций. Другой способ — использовать для этого OkHttp перехватчик.
5.1. Аутентификация с аннотациями
Предположим, что вы хотите запросить информацию о пользователе, для которой требуется аутентификация. Вы можете сделать это, добавив новый параметр в определение API, например:
С помощью аннотации @ Header(«Authorization») вы говорите Retrofit добавить заголовок Authorization в запрос со значением, которое вы передаете.
Чтобы генерировать учетные данные для Basic authentication, вы можете использовать класс OkHttps Credentials с его базовым (String, String) методом. Метод принимает имя пользователя и пароль и возвращает учетные данные аутентификации для Http Basic схемы.
Если вы хотите использовать API токен и не использовать Basic схему, просто вызовите метод getUserDetails(String) с вашим токеном.
5.2. Аутентификация с помощью OkHttp перехватчиков.
Метод выше добавляет учетные данные, только если вы запрашиваете данные пользователя. Если у вас больше вызовов, требующих аутентификации, для этого вы можете использовать перехватчик. Перехватчик используется для изменения каждого запроса до его выполнения и устанавливает заголовок запроса. Преимущество состоит в том, что вам не нужно добавлять @ Header(«Authorization») к каждому определению метода API.
Чтобы добавить перехватчик, вы должны использовать метод okhttp3.OkHttpClient.Builder.addInterceptor(Interceptor) в OkHttp Builder.
Созданный OkHttp клиент должен быть добавлен в ваш Retrofit клиент с помощью метода retrofit2.Retrofit.Builder.client(OkHttpClient).
Как вы заметили, здесь используется класс Credentials для Basic авторизации.
Опять же, если вы хотите использовать токен API, просто используйте вместо этого токен.
6. Упражнение: использование Retrofit для запроса к Gerrit в Java
В следующем разделе описывается, как создать минимальное Java приложение, которое использует Retrofit для получения объектов открытых изменений из Gerrit API. Результаты печатаются в консоли.
6.1. Создание и настройка проекта
Это упражнение предполагает, что вы знакомы с Gradle и Buildship для Eclipse.
Создайте новый проект Gradle с именем com.vogella.java.retrofitgerrit. Добавьте новый пакет в src/main/java с именем com.vogella.java.retrofitgerrit.
Добавьте следующие зависимости в файл build.gradle.
6.2. Определите API и Retrofit адаптер
В JSON ответе от Gerrit нас интересует только вопрос об изменениях. Поэтому создайте следующий класс данных в ранее добавленном пакете по умолчанию.
Определите REST API для Retrofit с помощью следующего интерфейса.
Создайте следующий класс контроллера. Этот класс создает Retrofit клиент, вызывает Gerrit API и обрабатывает результат (выводит результат вызова в консоль).
Создайте класс с main-методом для запуска контроллера.
7. Упражнение: использование Retrofit для конвертирования XML-ответа от RSS-канала
В этом разделе описывается использование Retrofit для преобразования XML-ответа с помощью SimpleXMLConverter.
Создается минимальное приложение Java, которое запрашивает RSS-канал Vogella (http://vogella.com/article.rss) и печатает название канала, названия и ссылки на статьи.
7.1. Создание и настройка проекта
Это упражнение предполагает, что вы знакомы с Gradle и Buildship для Eclipse.
Создайте новый проект Gradle с именем com.vogella.java.retrofitxml. Добавьте новый пакет в src/main/java с именем com.vogella.java.retrofitxml.
Добавьте следующие зависимости в файл build.gradle.
7.2. Определяем XML представление
Новостная RSS лента выглядит следующим образом:
Кроме XML заголовка этот файл состоит из различных элементов XML. Rss-элемент содержит элемент канала, в котором содержатся другие элементы (например, title, description, pubDate) и несколько item-элементов (статей).
Создайте следующие два класса данных: RSSFeed и Article.
Класс Article представляет одну статью и сохраняет только название и ссылку на статью. Это единственные поля, которые нас интересуют.
Аннотация @ Root помечает класс как подлежащий (де)сериализации. При желании вы можете указать имя в @ Root аннотации, которая соответствует имени XML элемента. Если имя не указано, имя класса используется как имя XML элемента. Поскольку имя класса (RSSFeed) отличается от имени элемента XML (rss), нам нужно указать имя.
Когда в strict параметр установлено значение false, строгий парсинг отключен. Это говорит парсеру не прерываться и не генерировать исключение, если найден XML элемент или атрибут, для которого не представлено сопоставление. Поскольку rss-элемент имеет атрибут version, для которого нет соответствующего поля, приложение будет генерировать ошибку, если strict параметр не установлен как false.
С помощью аннотации @ Element представляется XML-элемент. При необходимости можно указать имя XML элемента, представленного этим полем. Если имя не указано, используется имя поля.
Поле articleList аннотируется с помощью @ ElementList. Это показывает, что это поле используется для хранения коллекции (в нашем случае: List ) XML элементов с тем же именем. Когда inline установлено значение true, это значит, что элементы коллекции перечислены один за другим сразу внутри заданного элемента и не имеют промежуточного родительского элемента.
С помощью аннотации @ Path можно указать путь к элементу XML внутри дерева XML. Это полезно, если вы не хотите моделировать полное дерево XML с объектами Java. Для названия канала и нескольких item-элементов мы можем напрямую указывать на конкретные элементы в channel-элементе.
7.3. Определение API и Retrofit адаптера
Определите REST API для Retrofit через следующий интерфейс.
Создайте следующий класс контроллера. Этот класс создает Retrofit клиент, вызывает Vogella API и обрабатывает результат.
Последний шаг — создать класс с main-методом для запуска контроллера.
8. Упражнение: Создание приложения для запроса к StackOverflow
StackOverflow — популярный сайт для вопросов связанных с программированиес. Он также предоставляет REST API, хорошо документированный на странице Stackoverflow API.
В этом упражнении вы будете использовать REST Retrofit библиотеку. Вы будете ее использовать для запроса к StackOverflow вопросов по тегу и их ответов.
В нашем примере мы используем следующий URL-адрес запроса. Откройте этот URL в браузере и посмотрите на ответ.
8.1. Создание и настройка проекта
Создайте приложение для Android, с названием com.vogella.android.stackoverflow. Используйте com.vogella.android.stackoverflow как имя пакета верхнего уровня.
Добавьте следующие зависимости в файл build.gradle.
8.2. Создание модели данных
Нас интересуют вопросы и ответы от Stackoverflow. Для этой цели создайте следующие два класса данных.
8.3. Создание activity и layout
Задайте activity_main.xml для вашей activity.
Добавьте в свой проект класс recycler view адаптера, с именем RecyclerViewAdapter.
Одна из возможных реализаций выглядит следующим образом.
Измените класс MainActivity таким образом:
8.4. Использование поддельного поставщика данных
Создайте поддельный поставщик данных и заполните spinner фальшивыми вопросами и recyclerview фальшивыми ответами (после изменения выбора в spinner).
Теперь настроим spinner и recyclerview для использования этих поддельных данных.
8.5. Добавление Gradle зависимостей и разрешений
Добавьте следующие зависимости в build.gradle файл.
Добавьте разрешение на доступ к Интернету в манифест.
8.6. Определение API и Retrofit адаптера
Stackoverflow API оборачивает ответы или вопросы в JSON объект с именем items. Чтобы обработать это, создайте следующий класс данных с именем ListWrapper. Это необходимо для того, чтобы обработать обертку элементов Stackoverflow. Этот класс принимает параметр типа и просто упаковывает список объектов этого типа.
Определите REST API для Retrofit через следующий интерфейс.
8.7. Установка activity
Измените код MainActivity следующим образом.
8.8. Необязательно: получение изображения профиля пользователя
Измените layout строки в recycler view, чтобы отобразить также изображение профиля пользователя. Расширьте свою модель данных, чтобы получать изображение профиля пользователя, который ответил на вопрос. Добавьте ImageView в layout строки и используйте библиотеку Glide для загрузки изображения.
8.9. Необязательно: используйте разные layout’ы для четных и нечетных строк
Измените реализацию адаптера, чтобы использовать разные макеты для четных и нечетных строк.
Это требует создания различных layout на основе типа данных. Используйте getItemViewType() в адаптере.
8.10. Необязательно: Обработка ошибки сети
Если у вас произошел сбой в сети, покажите кнопку повторного запроса вместо основного пользовательского интерфейса.
9. Упражнение: Использование Retrofit для доступа к GitHub API в Android
В этом упражнении описывается, как перечислить все GitHub репозитории для пользователя в приложении для Android с помощью Retrofit. Вы можете выбрать репозиторий из раскрывающегося списка и указать обсуждения (issues), относящиеся к пользователю для выбранного репозитория.
Затем вы можете выбрать обсуждение из дополнительного раскрывающегося поля и опубликовать комментарий к нему. DialogFragment будет использоваться для ввода учетных данных для аутентификации.
Убедитесь, что у вас есть учетная запись Github, поскольку это необходимо для этого упражнения. Поскольку Retrofit будет использоваться вместе с RxJava2 во время этого упражнения, обратите внимание также на RxJava2 Tutorial.
9.1. Настройка проекта
Создайте Android приложение с именем Retrofit Github. Используйте com.vogella.android.retrofitgithub как имя пакета верхнего уровня и используйте пустой шаблон. Убедитесь, что проставлен флаг «Backwards Compatibility» (Обратная совместимость).
Чтобы использовать Retrofit и RxJava2 CallAdapter, добавьте следующие зависимости в файл build.gradle
Добавьте разрешение на доступ к Интернету в манифест.
9.2. Определение API
Создайте следующие два класса данных: GithubIssue и GithubRepo.
Из информации о репозиториях только имя и URL-адрес репозитория будут отображены в раскрывающемся списке. Также добавляем владельца (owner) в класс данных, так как имя владельца необходимо для того, чтобы позже запрашивать обсуждения.
Мы показываем только id и заголовок обсуждения в раскрывающемся поле, поэтому создаем поле для каждого из них. Кроме того, ответ от Github содержит URL-адрес для публикации комментария, который сохраняется в поле comments_url. Чтобы позже опубликовать новый комментарий к Github API, добавляем поле с именем comment. Github API указывает, что содержимое комментария должно быть привязано к полю с именем body в запросе JSON. Поскольку Retrofit (де)сериализует все поля на основе их имени, и поскольку мы не хотим использовать тело в качестве имени поля в нашем классе GithubIssue, мы используем аннотацию @SerializedName. С помощью этой аннотации мы можем изменить имя, с которым поле (де)сериализуется в JSON.
К сожалению, класса GithubRepo недостаточно, чтобы запросить всю необходимую информацию о репозитории. Как вы видите здесь, владелец репозитория является отдельным JSON объектом в ответе репозитория, и поэтому обычно ему нужен соответствующий Java-класс для (де)сериализации. К счастью, Retrofit дает возможность добавить собственный типизированный JSONDeserializer для управления десериализацией определенного типа. Каждый раз, когда объект определенного типа должен быть десериализован, используется этот пользовательский десериализатор.
Для этого добавьте следующий класс GithubRepoDeserialzer.
Определите REST API для Retrofit через следующий интерфейс:
У вас может возникнуть вопрос об аннотации @ Url. С помощью этой аннотации мы можем указать URL для этого запроса. Это позволяет нам изменять URL для каждого запроса динамически. Нам нужно это для поля comments_url класса GithubIssue.
Аннотации @ Path связывают значение параметра с соответствующей переменной (фигурные скобки) в URL-адресе запроса. Это необходимо для указания владельца и имени репозитория, для которого должны быть запрошены обсуждения.
9.3. Диалоговое окно «Создание учетных данных»
Чтобы предоставить пользователю возможность хранить свои учетные данные в приложении, используется DialogFragment. Поэтому создайте следующий класс с именем CredentialsDialog, а также добавьте layout файл с именем dialog_credentials.xml в папку layout ресурсов.
Результат должен выглядеть примерно так, как показано на следующем скриншоте.
9.4. Создание Activity
Измените activity_main.xml следующим образом.
Две кнопки (для загрузки репозиториев и отправки комментария), два Spinner (раскрывающееся поле для отображения репозиториев и обсуждений) и EditText (для написания комментариев). Для запуска CredentialsDialog используется меню на панели инструментов Android. Чтобы создать его, добавьте xml файл меню с именем menu_main.xml в папку ресурсов меню (создайте папку, если она не существует).
Поскольку мы используем Toolbar виджет, вам нужно отключить action bar по умолчанию. Для этого измените xml style файл так, как показано ниже.
Измените код своей activity на следующий.
Здесь мы добавили созданный ранее GithubRepoDeserializer в качестве TypeAdapter в GsonBuilder. Чтобы обрабатывать аутентификацию для каждого вызова, добавили Interceptor в OkHttpClient. Чтобы методы API-интерфейса возвращали типы RxJava2, добавили RxJava2 CallAdapter к своему клиенту.
10. Упражнение: использование Retrofit с OAuth для запроса сведений о пользователе из Twitter на Android
В этом упражнении описывается, как войти в Twitter с помощью Retrofit на Android. Мы напишем приложение, которое может запрашивать и отображать данные пользователя для предоставленного имени пользователя. В этом упражнении мы используем аутентификацию Twitter application-only с OAuth 2 для авторизации. Чтобы это сделать это упражнение, вам необходимо иметь учетную запись Twitter. Кроме того, вам нужно перейти к приложениям Twitter и создать новое приложение, чтобы получить свой consumer key и сonsumer secret. Нам понадобится это позже, чтобы запросить наш токен OAuth.
10.1. Настройка проекта
Создайте приложение для Android с именем Retrofit Twitter. Используйте com.vogella.android.retrofittwitter как имя пакета верхнего уровня.
Чтобы использовать Retrofit, добавьте следующие строки в файл build.gradle
Добавьте разрешение на доступ к Интернету в манифест.
10.2. Определение API
Создайте следующие два класса данных, которые называются OAuthToken и UserDetails.
Класс OAuthToken используется для хранения bearer token, который мы запрашиваем у Twitter, с нашим ключом и тайной. Мы используем аннотацию @ SerializedName для установки имени Retrofit для (де)сериализации полей.
Класс UserDetails просто сохраняет несколько полей из ответа Twitter при запросе данных о пользователе. Мы не показываем все данные пользователя, которые содержались в ответе, только имя, местоположение, URL и описание.
Определите REST API для Retrofit через следующий интерфейс:
10.3. Создание Activity
Измените файл activity_main.xml и соответствующий класс MainActivity следующим образом:
Замените aConsumerKey и aSecret на consumer key и secret, полученные от Twitter.
Также взгляните на перехватчик, который мы добавляем к нашему Retrofit клиенту. Поскольку мы используем OAuth, наши учетные данные различаются для каждого вызова. Метод postCredentials должен размещать учетные данные (consumer key и secret) в Basic схеме для Twitter. В результате этот вызов возвращает bearer token, который Retrofit десериализует в наш класс OAuthToken, который затем сохраняется в поле токена. Любой другой запрос может (и должен) теперь использовать этот токен в качестве учетных данных для авторизации. Также запрашивается информация о пользователе.
Источник