Rest api android retrofit

Retrofit

Многие сайты имеют собственные API для удобного доступа к своим данным. На данный момент самый распространённый вариант — это JSON. Также могут встречаться данные в виде XML и других форматов.

Библиотека Retrofit упрощает взаимодействие с REST API сайта, беря на себя часть рутинной работы.

Авторами библиотеки Retrofit являются разработчики из компании «Square», которые написали множество полезных библиотек, например, Picasso, Okhttp, Otto.

Библиотекой удобно пользоваться для запроса к различным веб-сервисам с командами GET, POST, PUT, DELETE. Может работать в асинхронном режиме, что избавляет от лишнего кода.

В основном вам придётся работать с методами GET и POST. Если вы будет создавать собственный API, то будете использовать и другие команды.

В Retrofit 2.x автоматически подключается библиотека OkHttp и её не нужно прописывать отдельно.

Библиотека может работать с GSON и XML, используя специальные конвертеры, которые следует указать отдельно.

Затем в коде конвертер добавляется с помощью метода addConverterFactory().

Список готовых конвертеров:

  • 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
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

Также вы можете создать свой собственный конвертер, реализовав интерфейс на основе абстрактного класса Converter.Factory.

Можно подключить несколько конвертеров (порядок важен).

Если вы хотите изменить формат какого-нибудь JSON-объекта, то это можно сделать с помощью GsonConverterFactory.create():

Базовый URL всегда заканчивается слешем /. Задаётся в методе baseUrl().

Можно указать полный URL в запросе, тогда базовый URL будет проигнорирован:

Для работы с Retrofit понадобятся три класса.

  1. POJO (Plain Old Java Object) или Model Class — json-ответ от сервера нужно реализовать как модель
  2. Retrofit — класс для обработки результатов. Ему нужно указать базовый адрес в методе baseUrl()
  3. Interface — интерфейс для управления адресом, используя команды GET, POST и т.д.

Работу с Retrofit можно разбить на отдельные задачи.

Задача первая. POJO

Задача первая — посмотреть на структуру ответа сайта в виде JSON (или других форматов) и создать на его основе Java-класс в виде POJO.

POJO удобнее создавать с помощью готовых веб-сервисов в автоматическом режиме. Либо можете самостоятельно создать класс, если структура не слишком сложная.

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

Задача вторая. Интерфейс

Задача вторая — создать интерфейс и указать имя метода. Добавить необходимые параметры, если они требуются.

В интерфейсе задаются команды-запросы для сервера. Команда комбинируется с базовым адресом сайта (baseUrl()) и получается полный путь к странице. Код может быть простым и сложным. Можно посмотреть примеры в документации.

Запросы размещаются в обобщённом классе Call с указанием желаемого типа.

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

Здесь также используются аннотации, но уже от самой библиотеки.

С помощью аннотации указываются веб-команды, а затем Java-метод. Для динамических параметров используются фигурные скобки (users//repos), в которые подставляются нужные значения.

В самой аннотации используется метод, используемый на сервере, а ниже вы можете указать свой вариант (полезно для соответствия стилю вашего кода.

Аннотации

Аннотация Описание
@GET() GET-запрос для базового адреса. Также можно указать параметры в скобках
@POST() POST-запрос для базового адреса. Также можно указать параметры в скобках
@Path Переменная для замещения конечной точки, например, username подставится в в адресе конечной точки
@Query Задаёт имя ключа запроса со значением параметра
@Body Используется в POST-вызовах (из Java-объекта в JSON-строку)
@Header Задаёт заголовок со значением параметра
@Headers Задаёт все заголовки вместе
@Multipart Используется при загрузке файлов или изображений
@FormUrlEncoded Используется при использовании пары «имя/значение» в POST-запросах
@FieldMap Используется при использовании пары «имя/значение» в POST-запросах
@Url Для поддержки динамических адресов

@Query

Аннотация @Query полезна при запросах с параметрами. Допустим, у сайте есть дополнительный параметр к запросу, который выводит список элементов в отсортированном виде: http://example.com/api/v1/products/cats?sort=desc. Это несложный пример и мы можем поместить запрос с параметром в интерфейс без изменений.

Если не требуется управлять сортировкой, то её можно оставить в коде и она будет применяться по умолчанию. Но в нашем запросе есть ещё один параметр, который отвечает за категорию котов (домашние, уличные, породистые), которая может меняться в зависимости от логики приложения. Этот параметр можно снабдить аннотацией и программно управлять в коде.

Сортировку мы оставляем как есть, а категорию перенесли в параметры метода под именем categoryId, снабдив аннотацией, с которой параметр будет обращаться на сервер в составе запроса.

Запрос получится в виде http://example.com/api/v1/products/cats?sort=desc&category=5.

В одном методе можно указать несколько Query-параметров.

Запрос может иметь изменяемые части пути. Посмотрите на один из примеров запроса для GitHub: /users/:username. Вместо :username следует подставлять конкретные имена пользователей (https://api.github.com/users/alexanderklimov). В таких случаях используют фигурные скобки в запросе, в самоме методе через аннотацию @Path указывается имя, которое будет подставляться в путь.

@Headers

Пример аннотации @Headers, которая позволяет указать все заголовки вместе.

@Multipart

Пример аннотации @Multipart при загрузке файлов или картинок:

@FormUrlEncoded

Пример использования аннотации @FormUrlEncoded:

Пример аннотации @Url:

Задача третья. Retrofit

Для синхронного запроса используйте метод Call.execute(), для асинхронного — метод Call.enqueue().

Объект для запроса к серверу создаётся в простейшем случае следующим образом

В итоге мы получили объект Retrofit, содержащий базовый URL и способность преобразовывать JSON-данные с помощью указанного конвертера Gson.

Далее в его методе create() указываем наш класс интерфейса с запросами к сайту.

После этого мы получаем объект Call и вызываем метод enqueue() (для асинхронного вызова) и создаём для него Callback. Запрос будет выполнен в отдельном потоке, а результат придет в Callback в main-потоке.

В результате библиотека Retrofit сделает запрос, получит ответ и производёт разбор ответа, раскладывая по полочкам данные. Вам остаётся только вызывать нужные методы класса-модели для извлечения данных.

Основная часть работы происходит в onResponse(), ошибки выводятся в onFailure() (неправильный адрес сервера, некорректные формат данных, неправильный формат класса-модели и т.п). HTTP-коды сервера (например, 404) не относятся к ошибкам.

Метод onResponse() вызывается всегда, даже если запрос был неуспешным. Класс Response имеет удобный метод isSuccessful() для успешной обработки запроса (коды 200хх). В ошибочных ситуациях вы можете обработать ошибку в методе errorBody() класса ResponseBody.

Другие полезные методы Response.

  • code() — HTTP-код ответа
  • body() — сам ответ в виде строки, без сериализации
  • headers() — HTTP-заголовки
  • message() — HTTP-статус (или null)
  • raw() — сырой HTTP-ответ

Можно написать такую конструкцию.

Для отмены запроса используется метод Call.cancel().

Перехватчики (Interceptors)

В библиотеку можно внедрить перехватчики для изменения заголовков при помощи класса Interceptor из OkHttp. Сначала следует создать объект перехватчика и передать его в OkHttp, который в свою очередь следует явно подключить в Retrofit.Builder через метод client().

Поддержка перехватчиков/interceptors для обработки заголовков запросов, например, для работы с токенами авторизации в заголовке Authorization.

HttpLoggingInterceptor

Библиотека HttpLoggingInterceptor является частью OkHttp, но поставляется отдельно от неё. Перехватчик следует использовать в том случае, когда вам действительно нужно изучать логи ответов сервера. По сути библиотека является сетевым аналогом привычного LogCat.

Подключаем перехватчик к веб-клиенту. Добавляйте его после других перехватчиков, чтобы ловить все сообщения. Существует несколько уровней перехвата данных: NONE, BASIC, HEADERS, BODY. Последний вариант самый информативный, пользуйтесь им осторожно. При больших потоках данных информация забьёт весь экран. Используйте промежуточные варианты.

RxJava

Сами разработчики библиотеки очень любят реактивное программирование и приложили многие усилия для интеграции с библиотекой RxJava.

Источник

Retrofit — библиотека для обмена с интернетом (Часть 1)

  1. Описание API Retrofit
  2. HTTP метода
  3. Подключение Retrofit

Описание API Retrofit

HTTP метода

1. Get и Head методы считаются самыми безопасными методами т.к. получают данные не изменяя их где либо. Первый метод получает заголовок и тело ответа тогда как второй только заголовок. Ответы от сервера приходят в виде коллекций значений. При запросе мы можем указать дополнительные параметры для отбора
На пример в запросе someadress.ru?list=10&name=ivanov мы передаем параметры отбора list = 10 и name = ivanov

2. Delete – метод выполняет одноименную функцию, удаляет записи на сервере. Для метода не требуется тело запроса

3. Post и Put методы создают или изменяют данные на сервере. В отличие от других этих методах наличие тело запроса обязательно. Put метод создаст запись на сервере если такого нет, если запись присутствует то он его изменит. Post создает записи и запускает процедуры на сервере. Можно запомнить следующее выражения: Put – отправляет данные и Post – Отправляет сообщение на сервер

Примеры приведены в IDE Android Studio

Нужно настроить обмен таким образом чтоб обмен между клиентом и сервером проходил на одном формате. В основном используются 3 формата данных. Ниже приведен пример отображение на трёх форматах:

Жаль, что в этом списке нет формата для java класса, что-то такое:

Для передачи объектов java на сервер, который может работать на любом языке, retrofit использует конвертор данных (Data converter). Эти конверторы так же называются библиотеки сериализации данные. У Retrofit включает в себя 6 конверторов которые используют самые популярные библиотеки сериализации: Gson, Jackson, Moshi, Protobuf, Wire и Simple XML. Какой из конверторов использовать зависит от того какой формат принимает сервер.
Для примеров использую GSon конвертор т.к. он прост в использовании

Подключение Retrofit

Для демонстрации возможностей retrofit создам demo приложение, версия Android 7.0 (Nougat). Переходим в раздел Download на официальном сайте retrofit и копируем строку для grade в моем случаи.

Источник

Rest API integration in Android Studio using Retrofit 2

A Web API is an application programming interface for either a web server or a web browser. API allows developers to interact with external services. These are the commands that the developer of the service has determined will be used to access certain features of their program.

Most APIs work using either XML or JSON. These languages allow us to send and retrieve large amounts of useful information in the form of objects.

XML is easy to understand and generally places keys inside triangle brackets, followed by their values.

JSON, “Javascript Object Notation.” It is a short-hand for sending data as value/attribute pairs.

REST API

A REST API is an application programming interface (API) that conforms to the constraints of REST architectural style and allows for interaction with RESTful web services. REST stands for representational state transfer and was created by computer scientist Roy Fielding.

REST API is designed to take advantage of existing protocols. While REST can be used over nearly any protocol, it usually takes advantage of HTTP when used for Web APIs. This means that developers do not need to install libraries or additional software in order to take advantage of a REST API design.

Retrofit

Retrofit is a type-safe REST client for Android, Java and Kotlin developed by Square. The library provides a powerful framework for authenticating and interacting with APIs and sending network requests with OkHttp.

This library makes downloading JSON or XML data from a web API fairly straightforward. Once the data is downloaded then it is parsed into a Plain Old Java Object (POJO) which must be defined for each “resource” in the response.

Retrofit

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

Today we are going to see how to use Retrofit HTTP client in your Android application.

Getting Started

This tutorial contains two parts

  • Basic REST API creation in nodejs using express and hosting it in heroku.
  • Basic android app creation and consume the custom api in it.

1. REST API creation

Consider I am going to create a REST API for reading some book information. For that, we have a JSON based database of books having the following books in a file books.json:

First we have to create a db handler to read the content from the books.json file. ( db_handler/book.js)

Then create a router file to catch all the requests for books. ( routes/book.js)

Finally we are going to create a server and add the router in it. ( index.js)

There is also a public folder for serving images to the client. You can provide access to the directory by the following code in your index file.

You can get the images in your client by it’s names along with server IP.

Now the server creation part is over. You can run the server by

It’s the time to deploy your node app in heroku. Heroku is a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud.

First you have to create an account in heroku and login to the portal. You will get the dashboard like this.

Click on Create new app button.

Provide an app name and click on Create app. Here I used retrofit-backend-demo. You can use your own name for your app. Now your app is ready and we can deploy the server in the app.

There are 3 methods available for deployment. I already have installed the Heroku Git in my system and I feel it as the simplest way to deploy your app. So, In this example we are going to push our node app using Heroku Git.

Use the commands that mentioned in the deploy tab (Fig 3) to deploy your app.

After successful deployment you will get a url along with deployed to Heroku message. This will be the url of your server. You can test the url in your browser to verify your app response. If it’s showing any error then use heroku logs to check the logs.

2. Android app creation

lets create a new project in Android Studio.

  1. Go to File ⇒ New Project. When it prompts you to select the default activity, select Empty Activity and proceed.
  2. First up, we need to add internet permission to our Android Manifest file to make sure our app is allowed to go online.

3. Open build.gradle in (Module:app) and add Retrofit, Picasso, RecyclerView, Gson dependencies.

4. Converting Json to Java object.

A route is a URL that represents an endpoint for the API. If we take a look at JSON Placeholder, you’ll see we have options such as ‘/book’ and ‘/comment’ etc. We already mentioned the JSON representation of books. So, to handle this information, we’re going to need a class that can build objects from the deserialized data.
For that, create a new class in your project named Book under model package. This will need variables that correspond to the data we’re getting from the /book api (isbn, titile, author etc). We’ll be getting that information from the web API, so we need a getter and setter for each of them.

The model class should look like this:

5. Create the Retrofit Instance

To issue network requests to a REST API with Retrofit, we need to create an instance using the Retrofit.Builder class and configure it with a base URL.
Create a class RetrofitClientInstance.java under network package. Here BASE_URL is the basic URL of our API where we will make a call.

6. Define the Endpoints
The endpoints are defined inside of an interface using special retrofit annotations to encode details about the parameters and request method.

This interface needs just a single method to retrieve all the data from /book. If you take a look at that JSON again, you’ll notice that the curly brackets are inside square brackets. This means that we have an array of objects, which is why we want to build a list for them. The objects are instances of our GetDataService that we just made.

7. Create custom adapter for binding data with RecycleView.
Create a class named CustomAdapter.java under adapter package like this.

8. Displaying the content
Inside the onCreate() method of the MainActivity.java, we initialize an instance of the GetDataService interface (line 16), the RecyclerView, and also the adapter. Finally, we call the generateDataList() method.

Let’s see what’s happening here.

enqueue() asynchronously sends the request and notifies your app with a callback when a response comes back. Since this request is asynchronous, Retrofit handles it on a background thread so that the main UI thread isn’t blocked or interfered with.

To use enqueue() , you have to implement two callback methods:

onFailure is, of course, where we need to handle any errors.

onResponse does not mean that everything went smoothly, however. It simply means that there was a response; that the website exists. Should we get a 404 message, this would still be considered a “response.” Thus, we need to check again if the process went smoothly with isSuccessful(), which checks to see that the HTTP code is not an error.

There you have it! Your own Android App in Android studio 🙂

I hope you had fun reading and/or following along. In the next story, we will look into how to build more features and interactions into this App. Stay tuned!
If you are interested in further exploring, here are some resources I found helpful along the way:

Источник

Читайте также:  Galaxy buds подключить андроид
Оцените статью