IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Delphi7 idhttpserver Post Json

    obaby发表于 2024-08-06 08:50:50
    love 0

    万万没想到,多年以后还会重新写 delphi 7 的代码。当然,代码不是全部都是自己写的,在原有的 demo 的基础上增加了一些功能。

    其中,有一个需求就是需要能够远程接收 http post 的请求,请求方式是 post,数据格式是 json。然而,多年不写代码,在网上随便一搜,搜到的代码感觉都是同一个地方抄来抄去实现的,在处理 poststream 的时候都会出问题。

    直到翻到了下面的代码,https://www.cnblogs.com/yangxuming/p/12462459.html

    1 procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
     2 var
     3   tmp: UTF8String; //也可以是 array of AnsiChar; 不能用RawByteString或 widestring
     4   tmpstr: string;
     5   size: Integer;
     6   JSONObject: TJSONObject; // JSON类
     7   i: Integer;
     8   jo: ISuperObject;
     9 begin
    10   size := ARequestInfo.PostStream.size;
    11   SetLength(tmp, size);
    12   ARequestInfo.PostStream.Position := 0;
    13   ARequestInfo.PostStream.ReadBuffer(tmp[1], size); //tmp为array of AnsiChar时为tmp[0]
    14   tmpstr := UTF8ToString(tmp);
    15 
    16   jo := SO(tmpstr);
    17   Memo1.Lines.Add(jo['test'].AsString);
    18 20   kbmMemTable1.Append;
    21   kbmMemTable1.FieldByName('test').AsString := jo['test'].AsString;
    22   kbmMemTable1.Post;
    23 
    24 //  Memo1.Lines.Add(ExtractFilePath(Application.ExeName) + 'testPrint.fr3');
    25 
    26   frxReport1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'testPrint.fr3');
    27   frxReport1.PrintOptions.ShowDialog := false;
    28   frxReport1.ShowProgress := False;
    29   frxReport1.PrepareReport;
    30   frxReport1.Print;
    31 
    32 //  JSONObject := TJSONObject.ParseJSONValue(Trim(tmpstr)) as TJSONObject;
    33 //  for i := 0 to JSONObject.Count - 1 do
    34 //    Memo1.Lines.Add(JSONObject.Pairs[i].JsonString.ToString + '=' +
    35 //      JSONObject.Pairs[i].JsonValue.ToString);
    36 end;

    这里的处理逻辑是争取的,poststream 貌似不能直接将 stream 转换为 stringstream 或者 memorystream,在后续的转换过程中会出错,当然,也可能是由于 stream 的Position位置异常导致的。

    另外 一个问题就是处理 json,网上的代码多数都是一笔带过,但是这个一笔带过就很烦人,找个可用的 json 库也比较麻烦,TJSONObject这个东西,看很多代码说都是内置的,但是实际在使用的时候,会提示找不到这个类。

    所以,可以借助第三方的 json 库,例如https://github.com/frostney/superobject

    通过这个东西来解析 json 就简单多了:

    var
      obj: ISuperObject;
    begin
      obj := SO('{"foo": true}');
      obj := TSuperObject.ParseString('{"foo": true}');
      obj := TSuperObject.ParseStream(stream);
      obj := TSuperObject.ParseFile(FileName);
    end;
    val := obj.AsObject.S['foo']; // get a string
     val := obj.AsObject.I['foo']; // get an Int64
     val := obj.AsObject.B['foo']; // get a Boolean
     val := obj.AsObject.D['foo']; // get a Double
     val := obj.AsObject.O['foo']; // get an Object (default)
     val := obj.AsObject.M['foo']; // get a Method
     val := obj.AsObject.N['foo']; // get a null object

    现在 ai 生成的代码质量的确也是个问题,这些小众(当前)语言生成的效果就更差了。



沪ICP备19023445号-2号
友情链接