Расширенное использование Envelop
В этой главе будет представлено использование завершённого примера в нашем проекте, который основан на разработке бэкенда приложения с использованием нулевой системы.
Метод использования шины событий представляет собой пример версии. Пожалуйста, обратитесь к Примеру версии шины событий, чтобы узнать больше о том, как использовать шину событий другим способом вместо сложной структуры up.god.file.
Наконец, структура файла up.god.service должна быть следующей, здесь игнорируется определение класса домена Topic, это образец POJO:
Поток запросов будет следующим:
(Запрос) -> Api -> (Шина событий) -> Рабочий процесс -> Stub -> Сервис
В этом проекте адрес должен управляться постоянным файлом up.god, чтобы избежать неправильных действий пользователя. Он определяется в интерфейсе com.tlk.up.god.cv.Addr как постоянные значения:
public interface Addr {
// ......
String TOPIC_HOT = "TLK://TOPIC/HOT";
String TOPIC_LATEST = "TLK://TOPIC/LATEST";
String TOPIC_MY = "TLK://TOPIC/MY";
}
Это интерфейс, аннотированный @EndPoint, исходный код следующий:
package com.tlk.topic.api;
import com.tlk.up.god.cv.Addr;
import io.vertx.up.annotations.Address;
import io.vertx.up.annotations.EndPoint;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/topic")
@EndPoint
public interface TopicApi {
@GET
@Path("/hot/{limit}")
@Address(Addr.TOPIC_HOT)
String top(@PathParam("limit") final Integer limit);
@GET
@Path("/latest/{limit}")
@Address(Addr.TOPIC_LATEST)
String latest(@PathParam("limit") final Integer limit);
@GET
@Path("/my/{limit}")
@Address(Addr.TOPIC_MY)
String my(@PathParam("limit") final Integer limit,
@HeaderParam("X-User-Id") final String userId);
}
Обратите внимание на следующие моменты:
package com.tlk.topic.api;
import com.tlk.up.god.cv.Addr;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.up.annotations.Address;
import io.vertx.up.annotations.Queue;
import io.vertx.up.commune.Envelop;
import io.vertx.up.kidd.Rapider;
import jakarta.inject.Inject;
@Queue
public class TopicWorker {
@Inject
private transient TopicStub stub;
@Address(Addr.TOPIC_HOT)
public void hot(final Message<Envelop> message) {
final Integer limit = Rapider.getInt(message, 0);
stub.query(new JsonObject(), getOptions("subscribers", limit), message);
}
@Address(Addr.TOPIC_LATEST)
public void latest(final Message<Envelop> message) {
final Integer limit = Rapider.getInt(message, 0);
stub.query(new JsonObject(), getOptions("createdTime", limit), message);
}
@Address(Addr.TOPIC_MY)
public void my(final Message<Envelop> message) {
final Integer limit = Rapider.getInt(message, 0);
final String userId = Rapider.getString(message, 1);
stub.query(new JsonObject().put("ownerId", userId),
getOptions("createdTime", limit), message);
}
private FindOptions getOptions(final String sortField,
final Integer limit) {
final FindOptions options = new
``` **FindOptions();**
options.setLimit(limit);
final JsonObject sort = new JsonObject().put(sortField, -1);
options.setSort(sort);
return options;
}
Будьте осторожны со следующим кодом:
final Integer limit = Rapider.getInt(message, 0);
final String userId = Rapider.getString(message, 1);
Это новый API, предоставленный io.vertx.up.kidd.Rapider
, kidd означает «Kidd», это имя относится к человеку «Kid the Phantom Thief». Это означает, что в этом режиме запроса нулевая система скрывает реализацию, подобно вору, который крадёт данные запроса из интерфейса агента непосредственно рабочему, минуя реализацию агента. Также Rapider
скрывает детали того, как преобразовать данные запроса в ожидаемые параметры. В приведённом выше коде мы можем получить переменную пути limit
и параметр заголовка X-User-Id
.
package com.tlk.topic.api;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.ext.mongo.MongoClient;
import io.vertx.up.commune.Envelop;
public interface TopicStub {
void query(final JsonObject filter,
final FindOptions options,
final Message<Envelop> message);
}
package com.tlk.topic.api;
import com.tlk.atom.Topic;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.ext.mongo.MongoClient;
import io.vertx.up.commune.Envelop;
import io.vertx.up.kidd.Heart;
import jakarta.inject.infix.Mongo;
public class TopicService implements TopicStub {
@Mongo
private transient MongoClient client;
@Override
public void query(final JsonObject filter,
final FindOptions options,
final Message<Envelop> message) {
// 1. Mongo Client to query by filter.
client.findWithOptions(Topic.TABLE, filter, options, res -> {
// 2. Build response.
final Envelop envelop = Heart.getReacts(getClass())
.connect(res).result().to();
message.reply(envelop);
});
}
}
Здесь представлен ещё один способ построения ответа под названием Heart
, он может помочь нам быстро построить ожидаемый результат, например:
final Envelop envelop = Heart.getReacts(getClass())
.connect(res).result().to();
Envelop
будет заполнена внутренняя ошибка сервера 500._id
будет заменён на key
в запросе/ответе, потому что React
будет использовать key
как первичный ключ, но mongo
будет использовать _id
как первичный ключ. Вы также можете заменить Spy
на connect Spy<T>
, чтобы установить этот код логически.result()
построит структуру данных JsonArray
и вернёт список результатов, как ожидалось.Мы добавим больше функций в нулевую систему, сосредоточившись на том, как нормализовать рабочий процесс запросов/ответов, а также ограничим случайные операции разработчика. Но вы также можете игнорировать указанный выше специфический код для реализации своей логики кода самостоятельно, разработчики могут делать это свободно. Единственное, что нужно помнить, — это то, что следует использовать единую модель Envelop
. Пожалуйста, обратитесь к справочному руководству, чтобы проверить модель единого ресурса: Как использовать Envelop (модель единого ресурса).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )