Имитация API со статическим файлом JSON в Java и Kotlin

Недавно мне пришлось создать API, который должен был возвращать чрезвычайно сложные и вложенные данные. Для создания этого API потребовались бы сотни запросов, и моя команда торопилась. Вот почему мы решили имитировать этот API с файлом JSON, содержащим ожидаемые данные, вручную написанным специалистом по данным.

Я мог бы вернуть файл JSON прямо из API, но это не было идеей. Вместо этого API должен был читать файл JSON из папки проекта, превращать его в объект Java и возвращать сериализованным в JSON, как обычно делал бы любой API Spring Boot. Все это самым быстрым способом и с максимально простой логикой.

Теперь давайте узнаем, как создать API в Spring Boot, который читает статический файл JSON и возвращает его содержимое в формате JSON через Jackson.

Почему API может потребоваться вернуть содержимое файла JSON

Есть как минимум две веские причины, по которым полезно читать содержимое статического файла JSON и возвращать его через API. Давайте покопаемся в них.

  1. Ваш ответ API никогда не меняется: в этом случае ответ может быть создан только один раз и может быть закэширован в статическом файле JSON. Это особенно полезно, когда ответ API сложный или включает вложенную структуру.
  2. Чтобы смоделировать ответ API: использование статического файла JSON в качестве источника данных для ответа API — хороший и быстрый способ смоделировать API.

От файла JSON к ответу API в Spring Boot

Давайте теперь посмотрим, как создать API, который читает файл JSON и возвращает его содержимое в Spring Boot, как в Java, так и в Kotlin.

Предпосылки

Во-первых, вы должны добавить commons-io.ommons-io и org.json к зависимостям вашего проекта.

Если вы являетесь пользователем Maven, добавьте следующую зависимость в файл POM вашего проекта:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20220320</version>
</dependency>

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

implementation group: 'commons-io', name: 'commons-io', version: '2.11.0'
implementation group: 'org.json', name: 'json', version: '20220320'

Теперь у вас есть все необходимое для достижения цели обучения.

Создание API, который читает статический файл JSON

Во-первых, давайте посмотрим на статический файл JSON:

Обратите внимание, что это всего лишь простой пример. Ваш статический файл JSON, вероятно, будет намного сложнее.

Затем поместите файл static-data.json в папку resources Spring Boot, как показано ниже:

Теперь вы готовы прочитать файл JSON и вернуть его содержимое. Давайте посмотрим, как этого добиться как в Java, так и в Kotlin.

Ява

Котлин

Как видите, ClassPathResource используется для загрузки static-data.json в переменную staticDataResource. Если вы не знакомы с ClassPathResource, это класс Spring Boot для загрузки ресурсов, размещенных в папке resouces.

Затем InputStream представление staticDataResource передается функции IOUtils.toString(). Эта вспомогательная функция commons-io преобразует его в переменную String.

Наконец, переменная staticDataString используется для инициализации экземпляра JSONObject, чье представление Map<String, Objcet>, полученное с помощью метода toMap(), возвращается в качестве ответа API.

Объект Map<String, Objcet> с .toMap() будет преобразован Джексоном в следующий ответ 200 HTTP content-type: application/json:

{
  "name": "Maria",
  "surname": "Williams",
  "age": 35
}

Это точно соответствует содержимому файла static-data.json.

И вуаля! Вы только что реализовали API, который считывает статический файл JSON и возвращает его содержимое в Spring Boot.

Заключение

В этой статье вы узнали, как использовать статические файлы JSON в приложении Spring Boot Java или Kotlin. В частности, вы увидели, как реализовать API, который считывает статический файл JSON и возвращает его содержимое в формате content-type: application/json. Это особенно полезно для имитации API в паре строк кода или для реализации API, ответ которых никогда не меняется.

Спасибо за прочтение! Я надеюсь, что вы нашли эту статью полезной. Не стесняйтесь оставлять любые вопросы, комментарии или предложения.