火神中间件之快速拓展一个自定义API接口

火神中间件提供了FastApi功能,可以让我们快速配置API接口,但是我们实际的项目需求,业务需求会很复杂,需要我们写很多相关业务逻辑代码,那么我们如何快速拓展写一个自定义的接口呢?


在我们火神中间件的源码中,拓展一个API接口是很简单的。


所有的接口只需要继承THTTPSingleWork类即可。


下面是一个最简易的接口例子代码:


 unit API.FireHTTPLogin;

interface

uses
   System.Classes, System.SysUtils, FireHTTPWork, FireHTTPRoot, JsonDataObjects,
   FireDataInfo, System.Generics.Collections, FirePublicClass,
   FireDAC.Comp.Client, Data.DB, FireDAC.Stan.Intf;
Const
   HttpUserRoutePath ='api/User';

type
   //类名你随意,但你要继承自THTTPSingleWork
   TFireHTTPLogin = class(THTTPSingleWork)
   private
   public
    //这是一个接口方法
    //Http请求路径为:HttpUserRoutePath+/Login   即:http://127.0.0.1:端口/api/User/Login

    procedure Login(QHTTPCtxt: THTTPCtxt; QWokrResult: THTTPResult);
   end;

implementation

{ TFireHTTPLogin }

procedure TFireHTTPLogin.Login(QHTTPCtxt: THTTPCtxt; QWokrResult: THTTPResult);
var
   lJson: TJsonObject;
begin
   lJson := TJsonObject.Create;
   try
    // QHTTPCtxt   这里是用户请求的参数,如果需要,可以判断用户参数的合法性以及取参数的值
    //本接口demo,没有请求参数

    //以下是返回Json内容(请求接口的结果)
    lJson.S['Token'] := 'abc';
    QWokrResult.ResultOut := lJson.ToJSON;
    QWokrResult.ResultOutMode := THTTPResultMode.TEXT;
    QWokrResult.SetHTTPResultTrue();
   finally
    lJson.DisposeOf;
   end;
end;

//一定要在这里注册接口
initialization
   FireHTTPRoot.Init_HTTPRootManage.AddHTTPWork(HttpUserRoutePath, TFireHTTPLogin, 20);

end.



然后编译,启动中间件。

在Post软件里面测试一下,如图:



请求结果如下图:




做一个接口是不是特别简单。


更多说明:

1.ResultOut的作用:如果去掉


 QWokrResult.ResultOutMode := THTTPResultMode.TEXT;



那么返回的 JSON 结果就是这样的:




我们的Json结果放在ResultOut字段里面。也就是说我们的代码里面生成的JSON是作为ResultOut字段的字符串类型值处理的。

如果设置增加了这行代码,那么我们就只输出我们提供的JSON内容。


2.下面演示一个解析请求参数QHTTPCtxt的例子


 procedure TFireHTTPTokenWork.Login(QHTTPCtxt: THTTPCtxt; QWokrResult: THTTPResult);
var lJson:TJsonObject;
   lusercode:string;
   luserpass:string;
   lDataSet:TFDMemTable;
   lSQL:String;
   lErrMsg:String;
   lTokenInfo:TTokenInfo;
begin
   lJson := TJsonObject.Create;
   try
    //加载Json数据
    lJson.FromJSON(QHTTPCtxt.FRequestInContent);
    lusercode := lJson.S['usercode'];
    luserpass := lJson.S['userpass'];
    if lusercode='' then
    begin
      QWokrResult.ResultMsg := '用户名称不可为空';
      exit;
    end;
    if luserpass='' then
    begin
      QWokrResult.ResultMsg := '用户密码不可为空';
      exit;
    end;
    //
    lDataSet := TFDMemTable.Create(nil);
    try
      //这边我是造一个SQL 来判断,换成你真实的库
      lSQL := 'select * from (select ''flm'' as usercode,''123'' as userpass) tmep '+
        ' where usercode=:usercode';
      if not Gobal_Help.FOneZTManage.OpenDataFast(lDataSet,'',lSQL,[lusercode],lErrMsg) then
      begin
        QWokrResult.ResultMsg := lErrMsg;
        exit;
      end;
      if lDataSet.RecordCount=0 then
      begin
        QWokrResult.ResultMsg := '不存在此用户';
        exit;
      end;
      if lDataSet.RecordCount>1 then
      begin
        QWokrResult.ResultMsg := '用户重复';
        exit;
      end;
      if lDataSet.FieldByName('userpass').AsString<>luserpass then
      begin
        QWokrResult.ResultMsg := '密码不一至';
        exit;
      end;
      //增加token
      lTokenInfo := Unit_TokenManage.AddToken();
      lTokenInfo.UserCode := lusercode;
      lTokenInfo.LoginIP := QHTTPCtxt.FClientIP;
      //返回信息回去
      lJson.clear;
      lJson.S['Token'] := lTokenInfo.Token;
      lJson.S['PrivateKey'] := lTokenInfo.PrivateKey;
      QWokrResult.ResultOut := lJson.ToJSON();
      QWokrResult.SetHTTPResultTrue();
    finally
      lDataSet.Free;
    end;
   finally
    lJson.Free;
   end;
end;


3.下面演示一个根据请求参数向数据库提交数据的例子


 unit API.FireHTTPLogin;

//自行拓展API例子
interface

uses
  FireGobalHelp, System.Classes, System.SysUtils, FireHTTPWork, FireHTTPRoot,
  JsonDataObjects, FireDataInfo, System.Generics.Collections, FirePublicClass,
  FireDAC.Comp.Client, Data.DB, FireDAC.Stan.Intf;

const
  HttpUserRoutePath = 'api/User';
type
   //类名你随意,但你要继承自THTTPSingleWork
  TFireHTTPLogin = class(THTTPSingleWork)
  private
  public
    //这是一个接口方法
    //Http请求路径为:HttpUserRoutePath+/Login   即:http://127.0.0.1:端口/api/User/Login
    procedure Login(QHTTPCtxt: THTTPCtxt; QWokrResult: THTTPResult);
  end;

implementation

{ TFireHTTPLogin }

procedure TFireHTTPLogin.Login(QHTTPCtxt: THTTPCtxt; QWokrResult: THTTPResult);
const
  vSql: string = 'select * from bshangpin where 1=2';
var
  lJson, resultJson: TJsonObject;
  i: integer;
  str, lErrMsg: string;
  lDataSet: TFDMemTable;
begin
  lJson := TJsonObject.Create;
  resultJson := TJsonObject.Create;
  try
    resultJson.I['code'] := 1;
    // QHTTPCtxt   这里是用户请求的参数,如果需要,可以判断用户参数的合法性以及取参数的值
    //请求参数示例:{"code":1,"data":[{"id":"3124577","mc":"可口可乐"}]}
    lJson.FromJSON(QHTTPCtxt.FRequestInContent);
    if lJson.I['code'] = 1 then
    begin
      lDataSet := TFDMemTable.Create(nil);
      lDataSet.CachedUpdates := True;
      try
        //从数据库获取数据方法
        if Gobal_Help.FOneZTManage.OpenDataFast(lDataSet, 'sql2008', vSql, [], lErrMsg) then
        begin
          for i := 0 to lJson['data'].Count - 1 do
          begin
            lDataSet.Append;
            if not lJson['data'].Items[i]['id'].IsNull then
              lDataSet.FieldByName('id').AsString := lJson['data'].Items[i]['id'].value;
            if not lJson['data'].Items[i]['mc'].IsNull then
              lDataSet.FieldByName('mc').AsString := lJson['data'].Items[i]['mc'].value;
            lDataSet.Post;
          end;
          //向数据库提交数据
          if not Gobal_Help.FOneZTManage.SaveDataFast(lDataSet, 'sql2008', vSql, 'bShangPin', 'Id', lErrMsg) then
          begin
            resultJson.I['code'] := 0;
            resultJson.S['ErrMsg'] := lErrMsg;
          end;
        end
        else
        begin
          resultJson.I['code'] := 0;
          resultJson.S['ErrMsg'] := lErrMsg;
        end;
      finally
        lDataSet.DisposeOf;
      end;
    end;
    //以下是返回Json内容(请求接口的结果)
    QWokrResult.ResultOut := resultJson.ToJSON;
    QWokrResult.ResultOutMode := THTTPResultMode.TEXT;
  finally
    lJson.DisposeOf;
    resultJson.DisposeOf;
  end;
end;
//一定要在这里注册接口
initialization
  FireHTTPRoot.Init_HTTPRootManage.AddHTTPWork(HttpUserRoutePath, TFireHTTPLogin, 20);
end.














联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678