я играюсь с fpjsonrpc и сделал простой сервер, отвечающий на запросы в json-rcp протоколе. Старт был быстрый и даже заработало. Но вот поднабралость много команд и пытаюсь выкрутиться.
В Lazarus есть возможность визуально накидать TJSONRPCHandler прямо в DataModule. Таким образом при создании датамодуля, все будет инициализовано из .lfm. Но мне визуальный подход не зашел, посколько нужны были потомки TJSONRPCHandler с дополнительными функциями. Например для дополнительной выдачи при запросе api. Вообщем пошел по пути через JSONRPCHandlerManager.
Тут вроде все просто, чтобы зарегистрировать команду TMyCmdClass (потомок TJSONRPCHandler) нужно вызвать функцию менеджера, которая добавляет новый хэндлер в коллекцию TJSONRPCHandlerDefs
- Код: Выделить всё
JSONRPCHandlerManager.RegisterHandler('MethodName', TMyCmdClass, ParamCount);
При этом в самом TMyCmdClass перекрывается функц. DoExecute, где и выполняется комманда.
Когда команд набирается много, происходит путаница, даже если комманды в одном юните. Хотелось бы:
1. как-то собрать все комманды, тоесть объявленных потомков TJSONRPCHandler в один массив (предпочтительнее во время компиляции) и потом прогнать в оном цикле JSONRPCHandlerManager.RegisterHandler по этому массиву. У меня "MethodName" и ParamCount хранятся как константы в TMyCmdClass, поэтому от туда и передаются в RegisterHandler
2. Параметры в TMyCmdClass это коллекция TJSONParamDefs, в визуальном варианте она инициализируется из потока, но не в мем случае. Я не нашел ничего лучше, чем сделать рекорд
- Код: Выделить всё
TCmd_ParamsRec = record
Name: TJSONStringType;
DataType: TJSONtype;
Required: boolean;
end;
и потом в самом классе TMyCmdClass определить массив
- Код: Выделить всё
const
Params: array [0..1] of TCmd_ParamsRec =
(
(Name: 'ParamFoo'; DataType: jtNumber; Required: true),
(Name: 'ParamBar'; DataType: jtString; Required: true)
);
ну и перекрыть Create от TJSONRPCHandler (<- там где создается пустая коллекция TJSONParamDefs) чтобы из свого Params массива в цикле перекидать в коллекцию через TJSONParamDefs.AddParamDef.
Как проще сразу инициализовать TJSONParamDefs?
По fpjsonrpc в сети очень мало, в сорцах fpc есть очень хорошие демки, которые мне и помогли. Буду признателен, если кто потожет или поделится опытом. Спасибо.