zoukankan      html  css  js  c++  java
  • 使用delphi-cross-socket 开发kbmmw smart http service

    前几天我说了使用delphi-cross-socket 扩展kbmmw 的跨平台支持,今天我说一下使用

    kbmMWCrossScoketHttpServerTransport 在linux 下支持 kbmmw 的samrt HTTP service.

    本例子基于以前的 使用delphi 10.2 开发linux 上的Daemon

    我们首先在dm 里面放置两个控件。

    加入我们的smart http service.

    连接linux 运行.

    在浏览器里面访问。

     在linux 里面查看进程

    大家可以看见这个后台进程。

    ok, 跨平台就这么任性。

    相关代码

    program Project2;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    uses
      Posix.Unistd,
      Posix.SysTypes,
      System.SysUtils,
      dmp in 'dmp.pas' {dmf: TDataModule},
      httpservice in 'httpservice.pas' {kbmMWCustomHTTPSmartService1: TkbmMWCustomHTTPSmartService};
    
    procedure daemon;
    
    begin
    
       dmf:=Tdmf.Create(nil);
       dmf.kbmmwserver1.AutoRegisterServices;
       dmf.kbmMWServer1.Active:=True;
      writeln('service started');
      try
    
        repeat
    
          sleep(10 * 1000);
    
        until False;
    
      finally
       dmf.Free;
      end;
    
    end;
    
    var
       pid: pid_t;
    
    begin
     
      pid := fork;
      if pid = 0 then
       begin
        writeln('starting service');
        daemon;
    
       end;
    
    end.
    unit httpservice;
    
    // =========================================================================
    // kbmMW - An advanced and extendable middleware framework.
    // by Components4Developers (http://www.components4developers.com)
    //
    // Service generated by kbmMW service wizard.
    //
    // INSTRUCTIONS FOR REGISTRATION/USAGE
    // -----------------------------------
    // Please update the uses clause of the datamodule/form the TkbmMWServer is placed on by adding services unit name 
    // to it. Eg.
    // 
    //     uses ...,kbmMWServer,YourServiceUnitName;
    // 
    // Somewhere in your application, make sure to register the serviceclass to the TkbmMWServer instance.
    // This can be done by registering the traditional way, or by using auto registration.
    // 
    // Traditional registration
    // ------------------------
    // var
    //    sd:TkbmMWCustomServiceDefinition;
    // ..
    //    sd:=kbmMWServer1.RegisterService(yourserviceclassname,false);
    // 
    // Set the last parameter to true if this is the default service.
    // 
    // 
    // Auto registration
    // -----------------
    // Make sure that your service class is tagged with the [kbmMW_Service] attribute.
    // Then auto register all tagged services:
    // ..
    //    kbmMWServer1.AutoRegisterServices;
    // 
    // -----------------------------------------------
    // 
    // SPECIFIC HTTP SERVICE REGISTRATION INSTRUCTIONS
    // -----------------------------------------------
    // Cast the returned service definition object (sd) to a TkbmMWHTTPServiceDefinition. eg:
    // 
    // var
    //    httpsd:TkbmMWHTTPServiceDefinition;
    // ..
    //    httpsd:=TkbmMWHTTPServiceDefinition(sd)
    //    httpsd.RootPath[mwhfcHTML]:='/';
    //    httpsd.RootPath[mwhfcImage]:='/images';
    //    httpsd.RootPath[mwhfcJavascript]:='/js';
    //    httpsd.RootPath[mwhfcStyleSheet]:='.';
    //    httpsd.RootPath[mwhfcOther]:='.';
    // -----------------------------------------------
    
    
    
    {$I kbmMW.inc}
    
    interface
    
    uses
      SysUtils,
    {$ifdef LEVEL6}
      Variants,
    {$else}
      Forms,
    {$endif}
      Classes,
      kbmMWSecurity,
      kbmMWServer,
      kbmMWServiceUtils,
      kbmMWGlobal,
      kbmMWCustomHTTPSmartService ,kbmMWHTTPUtils,
      kbmMWSmartServiceUtils,
      kbmMWRTTI;
    
    type
    
      [kbmMW_Service('name:xalionrest, flags:[listed]')]
      [kbmMW_Rest('path:/xalionrest')]
      // Access to the service can be limited using the [kbmMW_Auth..] attribute.
      // [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')]
    
      //[kbmMW_HTTP('accept:[get], root:[media:"webfiles", html:"webfiles"]')]
      TkbmMWCustomHTTPSmartService1 = class(TkbmMWCustomHTTPSmartService)
      private
         { Private declarations }
      protected
         { Protected declarations }
      public
         { Public declarations }
         // HelloWorld function callable from both a regular client,
         // due to the optional [kbmMW_Method] attribute,
         // and from a REST client due to the optional [kbmMW_Rest] attribute.
         // The access path to the function from a REST client (like a browser)+
         // is in this case relative to the services path.
         // In this example: http://.../xalionhttp/helloworld
         // Access to the function can be limited using the [kbmMW_Auth..] attribute.
         // [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')]
    
         [kbmMW_Rest('method:get, path:helloworld')]
         [kbmMW_Method]
         function HelloWorld:string;
    
         [kbmMW_Rest('method:get, path:version')]
         [kbmMW_Method]
         function version:string;
    
         [kbmMW_Method('EchoString')]       // 回应输入的串
         [kbmMW_Rest('method:get, path: ["echostring/{AString}","myechostring/{AString}" ]')]
         [kbmMW_Auth('role:[SomeRole,SomeOtherRole], grant:true')]
         function EchoString([kbmMW_Rest('value: "{AString}"')] const AString:string):string;
    
         [kbmMW_Method]
         [kbmMW_Rest('method:get, path: "cal/addnumbers"')]
         function AddNumbers([kbmMW_Rest('value: "$arg1", required: true')] const AValue1:integer;
                             [kbmMW_Rest('value: "$arg2", required: true')] const AValue2:integer;
                             [kbmMW_Arg(mwatRemoteLocation)] const ARemoteLocation:string):string;
    
    
    
         [kbmMW_Rest('method:post, path:postdata')]
         [kbmMW_Method]
         function postdata:string;
    
    
    
      end;
    
    implementation
    
    {%CLASSGROUP 'System.Classes.TPersistent'}
    
    uses kbmMWExceptions;
    
    {$R *.dfm}
    
    
    // Service definitions.
    //---------------------
    
    function TkbmMWCustomHTTPSmartService1.version: string;
    begin
          Result:='{"result":"'+self.Server.Version+':'+TOSversion.ToString  +'"}';
    end;
    
    function TkbmMWCustomHTTPSmartService1.AddNumbers(const AValue1,
      AValue2: integer; const ARemoteLocation: string):string;
    begin
          Result:='{"result":"'+(AValue1+AValue2).ToString+'"}';;
    end;
    
    
    function TkbmMWCustomHTTPSmartService1.EchoString(
      const AString: string): string;
    begin
         result:='{"result":"你好!'+astring+'"}';;
    end;
    
    function TkbmMWCustomHTTPSmartService1.HelloWorld:string;
    begin
         Result:='{"result":"Hello world"}';
    end;
  • 相关阅读:
    onclick中的函数的参数this
    classList的使用
    设置点击鼠标时不跳转
    模块补充shutil,logging
    re模块拾遗和递归函数
    正则表达式-re模块
    软件开发规范
    自定义模块2
    常用模块
    初识自定义模块
  • 原文地址:https://www.cnblogs.com/xalion/p/8404723.html
Copyright © 2011-2022 走看看