создание отдыха MongoInterceptor

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

Вот пример, который я пробовал, но документ ответа, который я создал и установил в плагине, не возвращается пользователю.

Можно ли это сделать с помощью MongoInterceptor?

@RegisterPlugin(name = "exampleInterceptor",
        description = "example interceptor",
        interceptPoint = InterceptPoint.REQUEST_AFTER_AUTH,
        priority = 100)
public class ExampleInterceptor implements MongoInterceptor {

    @Override
    public void handle(MongoRequest request, MongoResponse response)
            throws Exception
    {
        String dbName = request.getDBName();
        String collName = request.getCollectionName();
        String[] pathInfo = request.getMappedRequestUri().split("/");
        if (pathInfo.length == 3) {
            String id = pathInfo[2];
            BsonDocument doc = new BsonDocument();
            doc.put("db", new BsonString(dbName));
            doc.put("collection", new BsonString(collName));
            doc.put("id", new BsonString(id));
            response.setContent(doc);
        }
    }

    @Override
    public boolean resolve(MongoRequest request, MongoResponse response) {
        return true;
    }
}


person jim    schedule 29.09.2020    source источник


Ответы (1)


Чтобы изменить ответ, вам нужно interceptPoint = InterceptPoint.RESPONSE, иначе содержимое ответа будет перезаписано MongoService.

Также обратите внимание, что содержимое ответа может быть пустым (для запросов на запись), объектом (для GET /coll/docid) или массивом (для GET /coll), поэтому вам нужно иметь дело с разными случаями.

Попробуйте следующее:

@RegisterPlugin(name = "exampleInterceptor",
        description = "example interceptor",
        interceptPoint = InterceptPoint.RESPONSE, // <--- intercept the response
        priority = 100)
public class ExampleInterceptor implements MongoInterceptor {

    @Override
    public void handle(MongoRequest request, MongoResponse response)
    {
        String dbName = request.getDBName() == null ? "null" : request.getDBName();
        String collName = request.getCollectionName() == null ? "null": request.getCollectionName();
        BsonValue id = request.getDocumentId() == null ? BsonNull.VALUE : request.getDocumentId();

        BsonDocument responseContent;

        if (response.getContent() == null) { // null for write requests
             responseContent = new BsonDocument();
             response.setContent(responseContent);
        } else if (response.getContent().isDocument()) { // GET /coll/docid -> object
             responseContent = response.getContent().asDocument();
        } else { // GET /coll -> array
             responseContent = new BsonDocument();
             responseContent.put("docs", response.getContent());
             response.setContent(responseContent);
        }

        // add db, collection and id properties to response content
        responseContent.put("db", new BsonString(dbName));
        responseContent.put("collection", new BsonString(collName));
        responseContent.put("id", id);
    }

    @Override
    public boolean resolve(MongoRequest request, MongoResponse response) {
        return true;
    }
}
person Andrea Di Cesare    schedule 30.09.2020
comment
хорошо, это работает для моего примера. Однако заменяет ли это ответ после того, как исходный запрос был отправлен на сервер restheart? Я действительно хочу заменить весь исходный запрос модифицированным. Если я сделаю то, что вы предлагаете, похоже, я дважды попаду на сервер restheart - один раз для исходного запроса и один раз для моего измененного запроса. - person jim; 30.09.2020
comment
Перехватчик позволяет отслеживать и изменять запросы, обрабатываемые службой. В этом случае вы перехватываете запрос, обработанный MongoService (см. restheart.org/docs/plugins/ основные плагины). Если вы хотите реализовать пользовательскую логику, реализуйте службу, а не перехватчик... - person Andrea Di Cesare; 02.10.2020
comment
Вы можете найти пример службы, которая выполняет пользовательский запрос в MongoDb, по адресу github.com/SoftInstigate/restheart-examples/tree/master/ - person Andrea Di Cesare; 02.10.2020