wmdemo.pp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. unit wmdemo;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, HTTPDefs, fpHTTP, fpWeb, jsonreader;
  6. type
  7. { TEchoModule }
  8. TEchoModule = class(TFPWebModule)
  9. procedure DataModuleCreate(Sender: TObject);
  10. procedure TFPWebActions0Request(Sender: TObject; ARequest: TRequest;
  11. AResponse: TResponse; var Handled: Boolean);
  12. procedure TFPWebActions1Request(Sender: TObject; ARequest: TRequest;
  13. AResponse: TResponse; var Handled: Boolean);
  14. procedure TFPWebActions2Request(Sender: TObject; ARequest: TRequest;
  15. AResponse: TResponse; var Handled: Boolean);
  16. procedure TFPWebActions3Request(Sender: TObject; ARequest: TRequest;
  17. AResponse: TResponse; var Handled: Boolean);
  18. procedure TFPWebActions4Request(Sender: TObject; ARequest: TRequest;
  19. AResponse: TResponse; var Handled: Boolean);
  20. procedure TFPWebActions5Request(Sender: TObject; ARequest: TRequest;
  21. AResponse: TResponse; var Handled: Boolean);
  22. procedure TFPWebActions6Request(Sender: TObject; ARequest: TRequest;
  23. AResponse: TResponse; var Handled: Boolean);
  24. private
  25. { private declarations }
  26. public
  27. { public declarations }
  28. end;
  29. var
  30. EchoModule: TEchoModule;
  31. implementation
  32. {$R *.lfm}
  33. Uses fpjson,jsonparser,fpjsonrpc,webjsonrpc, jsonscanner, fpextdirect;
  34. { TEchoModule }
  35. procedure TEchoModule.DataModuleCreate(Sender: TObject);
  36. begin
  37. Cors.Enabled:=True;
  38. end;
  39. procedure TEchoModule.TFPWebActions0Request(Sender: TObject;
  40. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  41. {
  42. Demo 1. Manually do everything.
  43. Only a single method call is supported.
  44. }
  45. Var
  46. P : TJSONParser;
  47. Req,Res : TJSONData;
  48. Env,O : TJSONObject;
  49. M : TJSONStringType;
  50. E : TJSONRPCEcho;
  51. I : Integer;
  52. ID : TJSONData;
  53. Err : TJSONData;
  54. begin
  55. Res:=Nil;
  56. Err:=Nil;
  57. ID:=Nil;
  58. try
  59. P:=TJSONParser.Create(ARequest.Content,[joUTF8]);
  60. try
  61. Req:=P.Parse;
  62. try
  63. If Not (Req is TJSONObject) then
  64. JSONRPCError(SErrRequestMustBeObject);
  65. O:=(Req as TJSONObject);
  66. I:=O.IndexOfName('id');
  67. If (I=-1) then
  68. JSONRPCError(SErrNoIDProperty);
  69. ID:=O.Items[i].Clone;
  70. if O.IndexOfName('method')=-1 then
  71. JSONRPCError(SErrNoMethodName);
  72. M:=O.Strings['method'];
  73. If (m<>'echo') then
  74. JSONRPCError('Only echo method is supported');
  75. E:=TJSONRPCEcho.Create(Self);
  76. try
  77. I:=O.IndexOfName('params');
  78. Res:=E.Execute(O.Items[i],Nil);
  79. finally
  80. E.Free;
  81. end;
  82. finally
  83. Req.Free;
  84. end;
  85. finally
  86. P.Free;
  87. end;
  88. except
  89. On E : Exception do
  90. Err:=TJSONObject.Create(['message',E.Message,'name',E.ClassName,'code',-1]);
  91. end;
  92. If Assigned(ID) and (ID.JSONType<>jtNull) then
  93. begin
  94. Env:=TJSONObject.Create();
  95. try
  96. If not Assigned(Res) then
  97. Res:=TJSONNull.Create;
  98. Env.Add('result',Res);
  99. If (Err=Nil) then
  100. Err:=TJSONNull.Create;
  101. Env.Add('error',Err);
  102. Env.Add('id',ID);
  103. AResponse.Content:=Env.AsJSON;
  104. finally
  105. Env.Free;
  106. end;
  107. end;
  108. AResponse.SendContent;
  109. Handled:=True;
  110. end;
  111. procedure TEchoModule.TFPWebActions1Request(Sender: TObject;
  112. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  113. {
  114. Demo 2. Use a dispatcher to dispatch the requests.
  115. The handler is located on the owner module
  116. (it is created run-time, though).
  117. }
  118. Var
  119. Echohandler:TJSONRPCEcho;
  120. Disp : TJSONRPCDispatcher;
  121. P : TJSONParser;
  122. Req,res : TJSONData;
  123. O : TJSONRPCDispatchOptions;
  124. begin
  125. Echohandler:=TJSONRPCEcho.Create(Self);
  126. try
  127. EchoHandler.Name:='echo';
  128. Disp:=TJSONRPCDispatcher.Create(Self);
  129. try
  130. O:=Disp.Options;
  131. Include(O,jdoRequireClass);
  132. Disp.Options:=O;
  133. P:= TJSONParser.Create(ARequest.Content,[joUTF8]);
  134. try
  135. Req:=P.Parse;
  136. try
  137. Res:=Nil;
  138. Res:=Disp.Execute(Req,Nil);
  139. try
  140. If Assigned(Res) then
  141. begin
  142. AResponse.Content:=Res.AsJSON;
  143. end;
  144. AResponse.SendContent;
  145. Handled:=True;
  146. finally
  147. FreeAndNil(Res);
  148. end;
  149. finally
  150. Req.Free;
  151. end;
  152. finally
  153. P.Free;
  154. end;
  155. finally
  156. Disp.Free;
  157. end;
  158. finally
  159. EchoHandler.Free;
  160. end;
  161. end;
  162. procedure TEchoModule.TFPWebActions2Request(Sender: TObject;
  163. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  164. {
  165. Demo 3. Use a dispatcher to dispatch the requests.
  166. The handler is registered in the JSONFPCHandlerManager
  167. (it is created run-time, though).
  168. }
  169. Var
  170. Disp : TJSONRPCDispatcher;
  171. P : TJSONParser;
  172. Req,res : TJSONData;
  173. O : TJSONRPCDispatchOptions;
  174. begin
  175. JSONRpcHandlerManager.RegisterHandler('','echo',TJSONRPCEcho);
  176. try
  177. Disp:=TJSONRPCDispatcher.Create(Self);
  178. try
  179. O:=Disp.Options;
  180. Include(O,jdoSearchRegistry);
  181. Disp.Options:=O;
  182. P:= TJSONParser.Create(ARequest.Content,[joUTF8]);
  183. try
  184. Req:=P.Parse;
  185. try
  186. Res:=Nil;
  187. Res:=Disp.Execute(Req,Nil);
  188. try
  189. If Assigned(Res) then
  190. begin
  191. AResponse.Content:=Res.AsJSON;
  192. end;
  193. AResponse.SendContent;
  194. Handled:=True;
  195. finally
  196. FreeAndNil(Res);
  197. end;
  198. finally
  199. Req.Free;
  200. end;
  201. finally
  202. P.Free;
  203. end;
  204. finally
  205. Disp.Free;
  206. end;
  207. finally
  208. JSONRpcHandlerManager.UnRegisterHandler('','echo');
  209. end;
  210. end;
  211. procedure TEchoModule.TFPWebActions3Request(Sender: TObject;
  212. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  213. {
  214. Demo 4. Ext.Direct dispatcher
  215. The handler is registered in the JSONFPCHandlerManager
  216. (it is created run-time, though).
  217. }
  218. Var
  219. Disp : TExtDirectDispatcher;
  220. P : TJSONParser;
  221. Req,res : TJSONData;
  222. O : TJSONRPCDispatchOptions;
  223. begin
  224. JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
  225. try
  226. Disp:=TExtDirectDispatcher.Create(Self);
  227. try
  228. O:=Disp.Options;
  229. Include(O,jdoSearchRegistry);
  230. Disp.Options:=O;
  231. P:= TJSONParser.Create(ARequest.Content,[joUTF8]);
  232. try
  233. Req:=P.Parse;
  234. try
  235. Res:=Nil;
  236. Res:=Disp.Execute(Req,Nil);
  237. try
  238. If Assigned(Res) then
  239. begin
  240. AResponse.Content:=Res.AsJSON;
  241. end;
  242. AResponse.ContentLength:=Length(AResponse.Content);
  243. AResponse.SendContent;
  244. Handled:=True;
  245. finally
  246. FreeAndNil(Res);
  247. end;
  248. finally
  249. Req.Free;
  250. end;
  251. finally
  252. P.Free;
  253. end;
  254. finally
  255. Disp.Free;
  256. end;
  257. finally
  258. JSONRpcHandlerManager.UnRegisterHandler('','echo');
  259. end;
  260. end;
  261. procedure TEchoModule.TFPWebActions4Request(Sender: TObject;
  262. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  263. {
  264. Demo 5. Using a TJSONRPCContentProducer.
  265. The handler is registered in the JSONFPCHandlerManager
  266. (it is created run-time, though).
  267. }
  268. Var
  269. Cont : TJSONRPCContentProducer;
  270. disp : TJSONRPCDispatcher;
  271. begin
  272. JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
  273. try
  274. Cont:=TJSONRPCContentProducer.Create(Self);
  275. try
  276. disp:=TJSONRPCDispatcher.Create(Cont);
  277. Disp.Options:=Disp.OPtions+[jdoSearchRegistry];
  278. Cont.Dispatcher:=Disp;
  279. AResponse.ContentStream:=TMemoryStream.Create;
  280. try
  281. Cont.GetContent(ARequest,AResponse.ContentStream,Handled);
  282. AResponse.ContentLength:=AResponse.ContentStream.Size;
  283. If Handled then
  284. AResponse.SendContent;
  285. finally
  286. AResponse.ContentStream.Free;
  287. end;
  288. finally
  289. Cont.Free;
  290. end;
  291. finally
  292. JSONRpcHandlerManager.UnRegisterHandler('','echo');
  293. end;
  294. end;
  295. procedure TEchoModule.TFPWebActions5Request(Sender: TObject;
  296. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  297. {
  298. Demo 6. Creating an API response for Ext.Direct
  299. The handler is registered in the JSONFPCHandlerManager
  300. (it is created run-time, though).
  301. }
  302. Var
  303. D : TExtDirectDispatcher;
  304. begin
  305. JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
  306. try
  307. D:=TExtDirectDispatcher.Create(Self);
  308. try
  309. D.URL:=BaseURL+'ExtDirect';
  310. D.Options:=D.Options+[jdoSearchRegistry];
  311. AResponse.Content:=D.APIAsString;
  312. AResponse.ContentLength:=Length(AResponse.Content);
  313. finally
  314. D.Free;
  315. end;
  316. finally
  317. JSONRpcHandlerManager.UnRegisterHandler('','echo');
  318. end;
  319. end;
  320. procedure TEchoModule.TFPWebActions6Request(Sender: TObject;
  321. ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
  322. {
  323. Demo 6. Using a TJSONRPCModule instance to handle the request.
  324. The handler is registered in the JSONFPCHandlerManager.
  325. (it is created run-time, though).
  326. }
  327. Var
  328. M : TJSONRPCModule;
  329. begin
  330. JSONRpcHandlerManager.RegisterHandler('test','echo',TJSONRPCEcho);
  331. try
  332. M:=TJSONRPCModule.CreateNew(Self,0);
  333. try
  334. M.HandleRequest(ARequest,AResponse);
  335. Handled:=True;
  336. finally
  337. M.Free;
  338. end;
  339. finally
  340. JSONRpcHandlerManager.UnRegisterHandler('','echo');
  341. end;
  342. end;
  343. initialization
  344. RegisterHTTPModule('echo', TEchoModule);
  345. end.