Веб-клиент Quarkus Mutiny безопасно декодирует JSON
Я начал работать с Quarkus и пытался использовать Mutiny Vertx WebClient. Мой код работает, но я предпочитаю не полагаться на небезопасные / непроверенные назначения, как я сейчас написал код с помощью метода 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 использует Джексона под капотом, поэтому все, что можно сделать с Джексоном, возможно.
Вы можете использовать
resp.bodyAsJson(MyStructure.class)
, который создаст экземпляр MyStructure.
Если у вас есть массив JSON, вы можете сопоставить каждый элемент с классом объекта.
Наконец, вы можете реализовать собственный кодек тела (см. https://vertx.io/docs/apidocs/io/vertx/ext/web/codec/BodyCodec.html).