Fluent Java HTTP Client

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

В мире Java существует множество HTTP-клиентов для выбора. Тем не менее, я решил создать новый, потому что ни один из других клиентов полностью не удовлетворял всем моим требованиям. Возможно, я слишком требователен. Вот как взаимодействует мой клиент jcabi-http при выполнении HTTP-запроса и ожидании успешной HTML-страницы в ответе:

Я разработал этот новый клиент с учетом следующих требований:

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

Предполагаю, что вышеизложенное легко понять и поддерживать.

Новый клиент должен быть свободным, что означает, что вся взаимодействие с сервером помещается в одно выражение Java. Почему это важно? Я считаю, что потоковый интерфейс является самым компактным и выразительным способом выполнения нескольких императивных вызовов. По моим сведениям, ни одна из существующих библиотек не позволяет обеспечить такой потоковый стиль.

Я большой поклонник интерфейсов, главным образом потому, что они делают ваши дизайны более чистыми и высокорасширяемыми одновременно. В jcabi-http есть пять интерфейсов, расширенных двадцатью классами.

Request является интерфейсом, а также Response, RequestURI и RequestBody, предоставляемые им.

Использование интерфейсов делает библиотеку высокорасширяемой. Например, у нас есть JdkRequest и ApacheRequest, которые выполняют фактические HTTP-запросы к серверу с использованием двух полностью разных технологий: (JDK HttpURLConnection и Apache HTTP Client соответственно). В будущем будет возможно внедрить новые реализации, не нарушая существующий код.

Предположим, например, я хочу получить страницу и затем что-то с ней сделать. Эти два вызова выполняют задачу по-разному, но конечные результаты одинаковы:

XML and JSON Out-of-the-Box

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

Клиент jcabi-http поддерживает их оба из коробки, и в будущем можно будет добавить еще форматов по мере необходимости. Например, вы можете получить XML и извлечь строковое значение из его элемента:

В основном, ответ, полученный с помощью fetch(), декорируется с помощью XmlResponse. Затем это позволяет использовать метод xml(), который возвращает экземпляр интерфейса XML.

То же самое можно сделать с JSON с помощью Java JSON API (JSR-353).

Ни одна из библиотек, о которых я знаю или с которыми работал, не предлагает такую ​​возможность.

Последнее требование, но, безусловно, не менее важное, состоит в том, что мне нужно, чтобы все интерфейсы библиотеки были аннотированы @Immutable. Это важно, потому что я должен иметь возможность инкапсулировать экземпляр Request в других неизменяемых классах.

пс. Краткое резюме этой статьи было опубликовано на JavaLobby

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:35

sixnines availability badge   GitHub stars