REST Schnittstelle: JSON Eingang aus IPersistentstorage in Strings umwandeln

Hallo,

Ich versuche mich gerade an der REST Schnittstelle von
https://forum.mairlist.com/index.php/topic,9552.msg62281.html#msg62281

Das klappt schon ganz gut, ich schaffe es aber nicht,
das eingehende JSON entgegenzunehmen und darin
Felder für Stringvergleiche zu finden.

Ich verwende “procedure OnRESTRequest(Request: TRESTRequest; var Response: IPersistentStorage);” und sende einen JSON Request als POST herein:

{ 'hallo': 'test1', 'welt': 'test2'}

Der Eingangsrequest ist im Typ

TRESTRequest = record Method: string; Document: string; Parameters: IStrings; UploadDocument: IPersistentStorage; AuthUserID: integer; AuthUserName: string; AuthUserPermissions: string; end;

Method/Document/Parameters konnte ich auslesen,
da das JSON dort nicht drin ist, vermute ich es in UploadDocument

Hat jemand ein Beispiel, wie ich aus einem IPersistentStorage Objekt Strings oder
JSON extrahieren kann?

Request.UploadDocument.AsObject.FindString('hallo', '');

(Der zweite Wert ist der Default-Wert, falls der Key nicht gefunden wurde.)

IPersistentStorage ist ein abstraktes Interface für (die DOM-Repräsentation eines) JSON-Dokuments; das kann bekanntlich entwender vom Typ Null, Number, String, Boolean, Array oder Object sein.

Relevante Deklarationen:

type
  TPersistentType = (
    ptNull,
    ptNumber,
    ptString,
    ptBoolean,
    ptDateTime,
    ptArray,
    ptObject
  );

  IPersistentNull = interface;
  IPersistentNumber = interface;
  IPersistentString = interface;
  IPersistentBoolean = interface;
  IPersistentArray = interface;
  IPersistentObject = interface;

  IPersistentStorage = interface ['{240C0D27-2664-4308-906C-1940D4C4A01D}']
    function GetType: TPersistentType;

    function AsNull: IPersistentNull;
    function AsNumber: IPersistentNumber;
    function AsString: IPersistentString;
    function AsBoolean: IPersistentBoolean;
    function AsArray: IPersistentArray;
    function AsObject: IPersistentObject;

    function AsJSon(iIndent: boolean = false; iEscape: boolean = true): string;
    procedure Save(iFilename: string);
  end;

  IPersistentNull = interface(IPersistentStorage) ['{AFEC53DE-F239-4F87-AA54-131C5E9F5FCC}']
  end;

  IPersistentNumber = interface(IPersistentStorage) ['{A887CB3C-773C-4A6F-8550-500B4A56A6A6}']
    function GetValue: double;
    procedure SetValue(iValue: double);
    function GetIntValue: int64;
  end;

  IPersistentString = interface(IPersistentStorage) ['{30C4516B-9B8E-4CD9-A1A0-95F30E4F0C6F}']
    function GetValue: string;
    procedure SetValue(iValue: string);
  end;

  IPersistentBoolean = interface(IPersistentStorage) ['{6CAAE86B-C79B-4F86-A5FD-17789C7D11FA}']
    function GetValue: boolean;
    procedure SetValue(iValue: boolean);
  end;

  IPersistentDateTime = interface(IPersistentStorage) ['{7902BA7D-FCD7-48C9-8DE7-1778F0957954}']
    function GetValue: TDateTime;
    procedure SetValue(iValue: TDateTime);
  end;

  IPersistentArray = interface(IPersistentStorage) ['{0BACA3FF-80EC-475A-A308-5FF6EDE1BF2A}']
    function GetCount: integer;
    function GetItem(iIndex: integer): IPersistentStorage;
    procedure Add(iItem: IPersistentStorage);
    function AddNumber(iValue: double): IPersistentNumber;
    function AddString(iValue: string): IPersistentString;
    function AddBoolean(iValue: boolean): IPersistentBoolean;
    function AddObject: IPersistentObject;
    procedure Delete(iIndex: integer);
    procedure Clear;
  end;

  IPersistentObject = interface(IPersistentStorage) ['{E34B6230-386A-48E8-97C3-E0B4D8DC8072}']
    function GetCount: integer;
    procedure GetNames(oNames: TStrings);
    function GetValue(iName: string): IPersistentStorage;
    function GetValues: IPersistentArray;
    function TryGetValue(iName: string; out oValue: IPersistentStorage): boolean;

    function FindValue(iName: string): IPersistentStorage;
    function FindNumber(iName: string; iDefault: double = 0): double;
    function FindInteger(iName: string; iDefault: int64 = 0): int64;
    function FindString(iName: string; iDefault: string = ''): string;
    function FindBoolean(iName: string; iDefault: boolean = false): boolean;
    function FindArray(iName: string; out oResult: IPersistentArray): boolean;
    function FindObject(iName: string; out oResult: IPersistentObject): boolean;

    procedure Add(iName: string; iItem: IPersistentStorage);

    procedure SetValue(iName: string; iItem: IPersistentStorage);
    function SetNull(iName: string): IPersistentObject;
    function SetNumber(iName: string; iValue: double): IPersistentObject;
    function SetString(iName: string; iValue: string): IPersistentObject;
    function SetBoolean(iName: string; iValue: boolean): IPersistentObject;
    function SetArray(iName: string; iValue: IPersistentArray): IPersistentObject;
    function SetObject(iName: string; iValue: IPersistentObject): IPersistentObject;
    function CreateArray(iName: string): IPersistentArray;
    function CreateObject(iName: string): IPersistentObject;
    function FindOrCreateObject(iName: string): IPersistentObject;
    function FindOrCreateArray(iName: string): IPersistentArray;

    procedure DeleteValue(iName: string);

    function Merge(iValue: IPersistentObject): IPersistentObject;
  end;

Vielen Dank.

Das funktioniert prima, auch mit FindObject anstelle von FindString.

Ich hatte zunächst Ärger mit der SystemLog() Funktionalität -
wenn ich im Hintergrund die REST Aufrufe mit SystemLog gespeichert hatte, wurden Requests
oft mit Status_code 404 und 500 abgelehnt. Nachdem ich alle Log-Aufrufe entfernt habe,
ist das Problem verschwunden.

Also kann ich mir die Kommunikation per JSON erarbeiten.