Веб-клиент Quarkus Mutiny безопасно декодирует JSON

#java #quarkus #vertx-httpclient #mutiny

#java #quarkus #vertx-httpclient #мятеж

Вопрос:

Я изучал Quarkus и пытался использовать веб-клиент Mutiny Vertx. Мой код работает, но я предпочитаю не полагаться на небезопасные / непроверенные назначения, как я в настоящее время написал код с помощью метода bodyAsJson в HttpResponse. Есть ли лучший или более стандартный способ декодирования JSON из клиента Mutiny Vertx? Я понимаю, что мог бы просто вызвать bodyAsJsonObject и вернуть его, но мне нужно выполнить обработку данных, которые возвращаются из вызовов API, поэтому мне нужно декодировать их в класс, представляющий форму / структуру данных.

 package com.something.app.language;

import com.something.app.model.Language;
import io.micrometer.core.annotation.Timed;
import io.smallrye.mutiny.Uni;
import io.vertx.mutiny.core.Vertx;
import io.vertx.mutiny.ext.web.client.WebClient;

import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.List;

@ApplicationScoped
public class LanguageService {

    @Inject
    Vertx vertx;

    private WebClient client;

    @PostConstruct
    void init() {
        this.client = WebClient.create(vertx);
    }

    @Timed
    public Uni<List<Language>> getLanguages() {
        return this.client
                .get(80, "somehost.com", "/languages")
                .timeout(1000)
                .send()
                .onItem()
                .transform(resp -> {
                   if (resp.statusCode() == 200) {
                       return resp.bodyAsJson(List.class);
                   } else {
                       throw new RuntimeException("");
                   }
                });
    }
}
 

Ответ №1:

Существует несколько способов. Во-первых, Vert.x использует Jackson под капотом, поэтому все, что можно сделать с помощью Jackson, возможно.

Вы можете использовать resp.bodyAsJson(MyStructure.class) , что создало бы экземпляр MyStructure.

Если у вас есть массив JSON, вы можете сопоставить каждый элемент классу object.

Наконец, вы можете реализовать свой собственный кодек тела (см. https://vertx.io/docs/apidocs/io/vertx/ext/web/codec/BodyCodec.html ).