Для работы многих программ нужно обращаться к данным. Однако далеко не все данные могут храниться на устройстве, на котором запускается программа. Зачастую необходимо получать информацию из интернета. Например, запросить погоду по населённому пункту, чтобы отобразить её в программе. Как это сделать? С помощью обращения к специальным API.
API
API (Application Programming Interface) – это то, как взаимодействуют друг с другом программы. Например, вы пишете программу, которая должна создавать Word-документ. Вы обращаетесь к библиотеке, которая вызывает API Word-а. Таким образом, ваша программа взаимодействует с его API.
Или, что ближе к теме статьи, вы пишете программу, которая будет отображать ближайшие матчи в Английской Премьер-Лиге. Для того, чтобы получать информацию о матчах, вы делаете запросы к API в интернете. Или вы хотите в рамках вашей программы делать запросы к GPT, парсить их и отображать пользователю вашей программы. Как это? Говоря просто, сделать запрос к API означает открыть ссылку, на которой расположен ресурс с этим API, и при необходимости передать параметры запроса – например, за какие сезоны нужно получить футбольные матчи или на какой вопрос должна ответить GPT. Как правило, это get-запросы.
Если вы нажмёте сюда, то попадёте на страничку API, который выдаёт случайные цитаты.
JSON
JSON расшифровывается как JavaScript Object Notation. Это текстовый формат, в котором передаются данные. JSON состоит из ключей (имён полей) и значений. Выглядит это так – “ключ”: “значение”.
Нагляднее всего вам покажет пример. Если вы перешли по ссылке на API, то увидели в окне браузера некоторый текст. Это и есть JSON, то есть объект с ответом на ваш запрос. Он содержит информацию о случайной цитате.
Вот так будет выглядеть ответ в формате JSON, если мы самостоятельно, не в рамках программы, вставим ссылку для доступа к API в адресную строку браузера.
Программа будет делать то же самое – обращаться к этой ссылке в надежде получить JSON, чтобы затем отобразить цитату и её автора в программе. Для расшифровки ответа в формате JSON мы будем использовать библиотеку Gson.
Gson
Библиотека Gson позволяет распарсить ответ, который пришёл в JSON, в удобный и понятный java-объект.
Если вы используете сборщик проекта gradle, нужно вставить следующую строку в блок dependencies в build.gradle:
1 |
implementation 'com.google.code.gson:gson:2.8.9' |
Если вы пользуетесь maven, вставьте код в блок <dependencies></dependencies> в pom.xml:
1 2 3 4 5 |
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.8</version> </dependency> |
Хорошо. Теперь необходимо написать тот самый java-объект, в который будет расшифровываться ответ. Это несложно – просто выделим данные, которые нас интересуют, и определим их как поля класса. А также добавим геттеры и конструктор. В JSON нас интересуют текст и автор цитаты, поэтому названия полей мы берём такие же, какими они прописаны в самом JSON: quoteText и quoteAuthor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class QuoteResponse { private final String quoteText; private final String quoteAuthor; public QuoteResponse(String quoteText, String quoteAuthor) { this.quoteText = quoteText; this.quoteAuthor = quoteAuthor; } public String getQuoteText() { return quoteText; } public String getQuoteAuthor() { return quoteAuthor; } } |
Как видите, самый обычный java-объект.
OkHttp3
Чтобы воспользоваться библиотекой для отправки запросов http, необходимо её добавить в проект.
Давайте подключим эту библиотеку. Код для gradle:
1 |
implementation 'com.squareup.okhttp3:okhttp:4.9.1' |
Код для maven:
1 2 3 4 5 |
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.3</version> </dependency> |
Отлично. Теперь можно приступать к отправке запросов. Отображать информацию будем самым простым способом – в консоли. Хотя это могла бы быть и форма java swing, и android-приложение, и web-интерфейс.
Напишем бесконечный цикл while для того, чтобы пользователь мог сколько угодно запрашивать новые цитаты по вводу с клавиатуры – по нажатию клавиши enter. Основная логика заключена в методе main(). Реализация запросов к API – в методах sendForFormattedQuote() и sendForQuote().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import com.google.gson.Gson; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; import java.util.Scanner; public class ApiTest { public static void main(String[] args) { Request request = new Request.Builder() .url("https://api.forismatic.com/api/1.0/?method=getQuote&lang=ru&format=json") .build(); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("Нажмите enter для получения цитаты"); scanner.nextLine(); String text = sendForFormattedQuote(request); System.out.println(text); System.out.println(); } } private static String sendForFormattedQuote(Request request) { try { QuoteResponse quote = sendForQuote(request); if (quote == null) { return "Пустая цитата"; } String author = quote.getQuoteAuthor(); if (author.isEmpty()) { author = "Неизвестен"; } return quote.getQuoteText() + "\n" + "(c) " + author; } catch (IOException ex) { return "Возникла ошибка при получении цитаты. " + ex.getMessage(); } } private static QuoteResponse sendForQuote(Request request) throws IOException { OkHttpClient client = new OkHttpClient(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful() && response.body() != null) { String jsonResponse = response.body().string(); Gson gson = new Gson(); return gson.fromJson(jsonResponse, QuoteResponse.class); } else { return null; } } } } |
Вот как выглядит результат работы программы в консоли:
Кода совсем немного, а мотивационное приложение с цитатами практически готово. Да, консоль не самый удобный способ отображения, но этот способ отображения легко заменить на другой, причём используя всё тот же API. Например, можно отправлять запросы через Android-приложение.
API – универсальный инструмент, который упрощает взаимодействие между различными программными компонентами. Используйте API других программ и ресурсов, которые уже существуют, вместо того, чтобы изобретать велосипед!