Что такое rest api android
Consuming REST API using Retrofit Library in Android
Mar 19, 2017 · 10 min read
Hi Android beginner developers, in this tutorial, i’ll introduce you to the Retrofit Library and also try to provide a step by step guide on how to consume JSON objects using the retrofit library. This practice requires that you are familiar with Java and Android App development. For those interested in learning the very basics of Java, check my blog for some very old articles i wrote on Introduction to Java
In this tutorial, we are goin g to create an Android App that uses the Retrofit Library to download JSON Objects containing movie details from The Movie DB API, this movie details will now be displayed in a RecyclerView on the Android App.
Find the full source code for the project here on GitHub.
Retrofit is a REST Client library (Helper Library) used in Android and Java to create an HTTP request and also to process the HTTP response from a REST API. It was created by Square, you can also use retrofit to receive data structures other than JSON, for example SimpleXML and Jackson. Before we continue, let’s briefly define REST Client and REST API in our context.
REST Client in our case is the Retrofit library that is used on the client side (Android) to make HTTP request to REST API, in our case, The Movie DB API and also process the response.
A REST API defines a set of functions which developers can perform requests and receive responses via HTTP protocol such as GET and POST. in our case, The Movie DB (TMDB) API is the REST API.
We can also simply say that a RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data.
To use Retrofit in your Android Application, you’ll need 3 major classes.
According to Square, creators of Retrofit documentation, Retrofit turns your HTTP API into a Java interface. Sample codes for the interface and the method declared in it are as below:
Every method inside an interface represents one possible API call. It must have a HTTP annotation (GET, POST, etc.) to specify the request type and the relative URL. The return value wraps the response in a Call object with the type of the expected result.
Query parameters can also be added to a method.
You can use replacement blocks and query parameters to adjust the URL. A replacement block is added to the relative URL with <>. With the help of the @Path annotation on the method parameter, the value of that parameter is bound to the specific replacement block.
2. A Retrofit class which generates an implementation of the GitHubService interface. The below sample code would be inside the Retrofit class and this is how it creates an instance of Retrofit and implements the listRepos() method that’s in the GitHubService Interface.
3. The last of the 3 needed class is a simple POJO that matches each field in the JSON response object gotten from querying an API. It’s a simple class with getter and setter methods for each fields. We’ll see sample codes later.
Retrofit Converters are like an agreement between and Android client and the Server on the format on which data will be represented. Both parties can agree that for our communication, the format for data transfer will be JSON, as in our case in this tutorial. Remember i said apart from the JSON structure converter, we have others and here are some supported by Retrofit.
Gson is for JSON mapping and can be added with the following dependency:
SimpleXML is for XML mapping. You’ll need the following line for your build.gradle:
Jackson is an alternative to Gson and claims to be faster in mapping JSON data. The setup offers you a lot more customization and might be worth a look. You can add it with:
Moshi is another alternative to Gson. It’s created by the developers of Retrofit. Moshi is based on Gson, but differentiates itself with some simplifications. If you want to give this young new player on the market a try, add it with:
Retrofit supports Authentication for API calls that require the user to be authenticated before using the API to access resources. Querying Twitter, Facebook and StackoverFlow all require authentication. However, authentication feature is out of the scope of this tutorial as we’ll simply be querying The Movie DB(TMDB) API which requires no authentication.
Hmm! Enough talk, now It’s time to write some codes. Let’s now create an Android App using Android Studio. The App uses Retrofit to fetch Movie details from “The Movie DB” website and then displays these details on the Android Client RecyclerView Activity.
We’ll be using the TMDB API, So the first step is to get the API key from their website. TMDB is a popular website for getting information on movies, it’s a community built movie and TV database. It also provides a REST API that is well documented. Queries can be built using this API. click here to see the API documentation.
Click here for the website’s instructions on how to obtain API key, you just need to register and be logged in.
CREATE ANDROID APP
You might be wondering why add recyclerview and picasso dependencies, since we’ll be using Picasso to load image URLs into an imageView and we’ll display the movie details in a RecyclerView, so adding their dependencies at this stage is wise.
3. Since we’ll be querying the TMDB API which is a network operations we’ll need to add INTERNET permissions in AndroidManifest.xml file:
4. Create four sub packages named activity, adapter, rest and model in your main package. Move your empty MainActivity into the activity package.
Remember that after querying TMDB API, a JSON response will be returned. We need to know the exact fields that will be included in the response, so we can create a POJO that will be able to parse the latest movies. For us to know these fields in advance, let’s first define how a basic movie representation should look like
Using this URL (http://api.themoviedb.org/3/movie/top_rated?api_key=INSERT_YOUR_API_KEY) we can get the last 50 movies. Let’s insert it into browser and see. Using JsonViewer you can see JSON in more structured way. Copy the response from browser to this JsonViewer and this online tool show JSON like below:
5. So now that what we have seen the expected fields from the above image which shows the different fields of the JSON response, let’s create a class named Movie.java under model package which is a simple POJO to hold all fields and provide getter and setter methods for fields that we are expecting in the JSON response object. Past the below code in the Movie.java file.
6. We also need to create MovieResponse.java class inside the model package, since we have some extra fields like page number. This class contains all fetched movies and extra information. Create MovieResponse.java under model package and past the below code.
7. Next, let’s define the Interface containing the Endpoint method used to query the TMDB API. Special retrofit annotations are used to encode details about the parameters and request method. the interface defines each endpoint in the following way. Note that we only have one endpoint method in the Interface, in a real programming world scenario, you can have multiple endpoints methods inside the interface. So create an interface named MovieApiService.java and past the below codes.
8. Let’s now create the MainActivty.java class which is the activity from where we make request to the Movie DB API. Open the MainActivity.java and insert in the below codes.
Retrofit will download and parse the API data on a background thread, and then return the results back to the UI thread via the onResponse or onFailure method.
9. It’s time to display the result gotten from querying the API using the above codes on the layout. We’ll need to create a layout which will contain 4 textViews and 2 imageViews.
10. In other to the display the ratings, we need to create the star imageView, so create a layout named star.xml under res drawable with the below content.
11. Open the activity_main.xml file and copy the below code into it.
12. Create a layout named list_item_movie.xml under res layout folder
12. Adapter is a common pattern which helps to bind view and data, so let’s implement adapter for this. Create a class named MoviesAdapter.java under adapter package.
Now save and run the App. You can download the full source code for this project on GitHub
Android для начинающих: использование REST API
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Большинство из нас стали весьма жадны до новой информации, что в Интернете является такой важной частью нашей жизни. Поэтому создание приложений Android со статичным контентом может быть плохой идеей. Вместо этого вам следует рассмотреть возможность создания приложений, которые могут отображать свежий контент каждый раз, когда пользователь их открывает.
Это может звучать сложно, но с большим количеством сайтов, которые раскрывают свои ресурсы через REST API, на самом деле это довольно просто. (Смотрите руководство для начинающих по HTTP и REST для примера.)
В этом уроке я расскажу вам, как использовать классы и методы, доступные в Android SDK, для подключения к удаленным веб-серверам и взаимодействия с ними с использованием их REST API.
1. Включение доступа к Интернету
Поскольку android.permission.INTERNET не считается опасным разрешением, вам не нужно запрашивать его во время выполнения на устройствах с уровнем API 23 или выше.
2. Создание фоновых потоков
Если вы хотите узнать больше о выполнении операций в фоновом потоке, я предлагаю вам прочитать этот учебник о фоновых операциях из серии Android для начинающих.
3. Создание HTTP-соединения
В следующем фрагменте кода показано, как настроить соединение с корневой конечной точкой API GitHub:
4. Добавление заголовков запросов
5. Чтение ответов
Если класс HttpURLConnection получает код ответа на перенаправление, например 301, он автоматически обрабатывает его и следует за перенаправлением. Поэтому, как правило, вам не нужно будет писать дополнительный код для проверки перенаправления.
6. Разбор JSON ответов
То как вы извлекаете определенную часть информации из документа JSON, зависит от его структуры. Например, документ JSON, возвращаемый корневой конечной точкой REST API GitHub, выглядит следующим образом:
Вышеупомянутый код обрабатывает ответ JSON как поток токенов. Поэтому он потребляет очень мало памяти. Однако, поскольку он должен обрабатывать каждый отдельный токен один за другим, он может оказаться медленным при обработке больших ответов.
7. Использование разных HTTP методов
В следующем фрагменте кода показано, как отправить на сервер простую пару «ключ-значение»:
8. Кэширование ответов
В следующем фрагменте кода устанавливается кеш размером 100 000 байт:
Заключение
Существуют тысячи REST API-интерфейсов, которые вы можете свободно использовать в своих приложениях для Android. Используя их, вы можете сделать ваше приложение более информативным, интересным и многофункциональным. В этом уроке вы узнали, как использовать класс HttpURLConnection для использования таких REST API. Вы также узнали, как создать кеш ответов HTTP, который снижает использование потребление сетевого трафика вашим приложением.
Если вы считаете, что использование HttpURLConnection слишком сложное, вам следует обратить внимание на сторонние библиотеки, такие как например, Volley. Библиотеки, подобные этой, используют класс HttpURLConnection внутри, но предоставляют множество удобных методов, которые позволяют сделать ваш код более кратким и читаемым.
Чтобы узнать больше о работе с сетью на платформе Android, вы можете обратиться к руководству по сетевым операциям Android.
RESTful API под Android: pattern B
Совсем недавно, на собеседовании в Яндексе, мне довелось обсуждать организацию Rest-взаимодействия в Android-приложениях. В ходе обсуждения всплыл вопрос – почему из трех паттернов, предложенных на Google IO 2010 Virgil Dobjanschi, первый используется существенно чаще двух других. Вопрос меня заинтересовал.
Поскольку тема обсуждения достаточно узкоспециализированная, я с позволения читателей пропущу слова о том, насколько правильная архитектура Rest-взаимодействия важна в Android-приложениях и как часто Android-разработчики сталкиваются с подобными задачами.
Краткое описание паттернов и обзор
update, DELETE REST
Please note that in this particular pattern we broke the Content Provider contract a little bit. … Again, we’re not forcing you to adopt these particular design patterns.
В общем, не хотите – не используйте. Это воодушевляет.
Предлагаю кратко рассмотреть существующую реализацию Pattern B и попытаться понять, в чём же заключаются его особенности.
Приложение FinchVideo
Сразу отмечу, что этот код писался уважаемым G. Blake Meike в 2012 году, и с тех пор существенно не модифицировался, поэтому мы отнесёмся с пониманием к использованию всяких deprecated конструкций типа managedQuery, неиспользованию таких замечательных вещей как Loader, synchronized (HashMap) вместо ConcurrentHashMap и прочего – на архитектуру приложения они никак не влияют.
Итак, начнём с пользовательского интерфейса. В FinchVideoActivity всё вполне прозрачно – к ListView через SimpleCursorAdapter привязывается Cursor, в который и сливаются результаты запросов managedQuery к FinchVideoContentProvider.
Дальше – интереснее.
и HashMap — mRequestsInProgress (соответственно, набор выполняемых запросов). Обрабатываются результаты запросов в YouTubeHandler implements ResponseHandler, который и передаётся в задачу UriRequestTask при её создании.
Сопоставим существующие классы со схемой Pattern B.
С Activity и Content Provider всё достаточно ясно. Объект Service в явном виде в примере не используется, его функции и частично функции ServiceHelper по структурированию и запуску запросов выполняет FinchVideoContentProvider. Он же выполняет функции Processor, про Rest method написано выше. Такая вот упрощённая реализация.
Выводы
Может быть, кто-нибудь использовал этот паттерн в рабочих проектах или знает более удачные примеры реализации? Есть ли вообще смысл реализовать его более качественно (была такая идея), если за 4 года этим никто не озаботился? Буду рад видеть ответы в комментариях.
Связь android с web приложения посредством REST архитектуры. Часть 3 Реализация REST в android
Ну вот, когда мы ознакомились с некоторым понятиями, мы можем приступать к написанию небольшое приложения для демонстрации работы данной архитектуры. Наше приложения будет делать два запроса. Для получения списка пользователей и для получения пользователя по номеру id.
Для Java есть библиотека Retrofit, которая облегчает создания android restfull приложений и с которой мы будем работать, разрабатывая приложения.
Для того что бы подключить библиотеку допишем строки в Gradle что бы мы смогли собрать наш проект и спокойно работать с библиотекой.
Открываем файл build.gradle и дописываем необходимое:
Отлично, теперь нам необходимо создать интерфейс для работы с нашими пользователями. Для этого создаем интерфейс IrestUserApi.
С помощью аннотаций мы описываем запрос, который будет осуществлять наш метод при обращении на сервер.
И модель пользователя
После того открываем наш класс MainActivity добавляем там необходимый функционал для работы:
Теперь нам необходимо создать методы с помощью которых мы будем получать данные с сервера. Для наглядности работы мы будем использовать небольшие всплывающие сообщения. Для этого мы будем использовать такой компонент как Snackbar.
В данном методе используется интерфейс, который мы описали выше. В методе userApi.getUserById() создается анонимный класс в котором переопределяем 2 метода. Метод success() вызывается при успешном выполнения запроса, а метод failure() при неудачном.
После того как мы успешно выполнили запрос мы получили объект с нашим пользователем, обратите внимание что в примере для понимания работы были опущены различные проверки в дальше мы опишем более подробно. Сейчас же мы учитываем что пользователь которого мы будем получать есть на сервере.
Второй метод получает весть список пользователей который есть в системе
В методах viewUser(user); и viewUserList(users); мы отображаем на наших компонентах и давайте их реализуем
Теперь нам необходимо вернутся к нажим кнопочкам и заполнить обработчики событий, которые на данный момент у нас пустые.
Ниже показан полностью класс MainActivity в котором можно увидеть что на кнопке получения списка вызывается метод loadUserFromRest(); а на второй loadUserFromRest();
Теперь нам необходимо прописать на файл с манифестом и дописать туда разрешения на использования сети в приложении. Открываение файл AndroidManifest.xml и пишем туда
Теперь когда к нас все готово можно запускать наше приложения. В данной статье мы не рассматриваем написание северной части, а для тестирования можно написать всего пару строчек
Для первого запроса
Запускаем наше приложения и смотрим на то что мы написали
Введение в REST API — RESTful веб-сервисы
Эта статья начинает серию постов о разработке REST API:
Intro to RESTful Web Services
REST означает REpresentational State Transfer (Википедия: «передача состояния представления»). Это популярный архитектурный подход для создания API в современном мире.
Вы изучите:
Что такое REST?
REST расшифровывается как REpresentational State Transfer. Это был термин, первоначально введен Роем Филдингом (Roy Fielding), который также был одним из создателей протокола HTTP. Отличительной особенностью сервисов REST является то, что они позволяют наилучшим образом использовать протокол HTTP. Теперь давайте кратко рассмотрим HTTP.
Краткий обзор HTTP
Давайте сначала откроем браузер и зайдем на веб-страницу:
А затем щелкните на одной из страниц результатов:
Далее мы можем нажать на ссылку на странице, на которой мы оказались:
И перейти на другую страницу:
Вот как мы обычно просматриваем веб страницы.
Когда мы просматриваем страницы в Интернете, за кулисами происходит много вещей. Ниже приведено упрощенное представление о том, что происходит между браузером и серверами, работающими на посещаемых веб-сайтах:
Протокол HTTP
Когда вы вводите в браузере URL-адрес, например www.google.com, на сервер отправляется запрос на веб-сайт, идентифицированный URL-адресом.
Затем этот сервер формирует и выдает ответ. Важным является формат этих запросов и ответов. Эти форматы определяются протоколом HTTP — Hyper Text Transfer Protocol.
Когда вы набираете URL в браузере, он отправляет запрос GET на указанный сервер. Затем сервер отвечает HTTP-ответом, который содержит данные в формате HTML — Hyper Text Markup Language. Затем браузер получает этот HTML-код и отображает его на экране.
Допустим, вы заполняете форму, присутствующую на веб-странице, со списком элементов. В таком случае, когда вы нажимаете кнопку «Submit» (Отправить), HTTP-запрос POST отправляется на сервер.
HTTP и RESTful веб-сервисы
HTTP обеспечивает базовый уровень для создания веб-сервисов. Поэтому важно понимать HTTP. Вот несколько ключевых абстракций.
Ресурс
Ресурс — это ключевая абстракция, на которой концентрируется протокол HTTP. Ресурс — это все, что вы хотите показать внешнему миру через ваше приложение. Например, если мы пишем приложение для управления задачами, экземпляры ресурсов будут следующие:
URI ресурса
Когда вы разрабатываете RESTful сервисы, вы должны сосредоточить свое внимание на ресурсах приложения. Способ, которым мы идентифицируем ресурс для предоставления, состоит в том, чтобы назначить ему URI — универсальный идентификатор ресурса. Например:
REST и Ресурсы
Важно отметить, что с REST вам нужно думать о приложении с точки зрения ресурсов:
Определите, какие ресурсы вы хотите открыть для внешнего мира
Используйте глаголы, уже определенные протоколом HTTP, для выполнения операций с этими ресурсами.
Вот как обычно реализуется служба REST:
Компоненты HTTP
HTTP определяет следующую структуру запроса:
Методы HTTP-запроса
Метод, используемый в HTTP-запросе, указывает, какое действие вы хотите выполнить с этим запросом. Важные примеры:
Код статуса ответа HTTP
Код состояния всегда присутствует в ответе HTTP. Типичные примеры:
Резюме
В статье приведен на верхнем уровне обзор архитектурного стиля REST. Подчеркивается тот факт, что HTTP является основным строительным блоком REST сервисов. HTTP — это протокол, который используется для определения структуры запросов и ответов браузера. Мы видели, что HTTP имеет дело главным образом с ресурсами, доступными на веб-серверах. Ресурсы идентифицируются с помощью URI, а операции над этими ресурсами выполняются с использованием глаголов, определенных протоколом HTTP.
Наконец, мы рассмотрели, как службы REST наилучшим образом используют функции, предлагаемые HTTP, для предоставления ресурсов внешнему миру. REST не накладывает никаких ограничений на форматы представления ресурсов или на определение сервиса.