AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke RestServer Antwort Json ohne "[" Klammern
Thema durchsuchen
Ansicht
Themen-Optionen

RestServer Antwort Json ohne "[" Klammern

Ein Thema von ScharfeMietze · begonnen am 1. Feb 2016 · letzter Beitrag vom 3. Feb 2016
Antwort Antwort
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 11:52
https://www.youtube.com/watch?v=DdW8zssbQ0g
In diesem Vido wird beschrieben das auf einem Rest Server
function EchoJson: TJSONObject; TJSONObject als Result dienen kann.
Es wird mittels Result := TJSONObject.create erzeugt allerdings findet sich logischerweise nirgends ein .free.

Meine Frage an die Profis ist nun ob ich das so auch gefahrlos in jeder function so verwenden kann.
Ich erinnere mich an TStringlisten als result, die dann Leaks erzeugt haben.

Grüße
SM
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 12:00
Natürlich erzeugt das ein MemLeak, wenn du das nicht entsprechend behandlest und beim Aufruf der Funktion auch die LifeTime-Management-Verantwortung für das Ergebnis übernimmst.

Ist exakt das Gleiche wie bei
Delphi-Quellcode:
function BuildObject : TObject;
begin
  Result := TObject.Create;
end;

var
  lObj: TObject;
begin
  TObject.Create; // <= MemLeak
  BuildObject(); // <= MemLeak;

  // keine MemLeaks mit

  lObj := TObject.Create;
  try
    // ...
  finally
    lObj.Free;
  end;

  lObj := BuildObject();
  try
    // ...
  finally
    lObj.Free;
  end;
end;
Es gibt noch einen kleinen Unterschied:

Wenn beim Erzeugen der Instanz ein Problem auftritt, dann soll man auch dafür sorgen, dass die Instanz aufgeräumt wird (so wie das auch der constructor macht);
Delphi-Quellcode:
function BuildObject: TObject;
begin
  Result := TObject.Create; // <= Bei einer Excpetion gibt es keine Instanz
  try
    // hier noch beim Result-Object weitere Eigenschaften setzen
    // hier könnte es zu einer Exception kommen
  except
    Result.Free; // <= bei einer Exception, wird die Instanz verworfen
    raise; // <= und die Exception wieder ausgelöst
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 3. Feb 2016 um 12:05 Uhr)
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 12:29
Perfect!! Danke für die Antwort. Das sind immer diese Fehlerteufel wenn man es nicht beachtet und dann das Wundern losgeht.

Gruß
SM
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#4

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 13:07
Dann könnte die function so aussehen
Delphi-Quellcode:
function TServerMethods1.updateHddCrawler(Key: string; aJSONObject: TJSONObject): TJSONObject;
var
  LJSONObject: TJSONObject;
  s: string;
begin
Result := TJSONObject.Create;
  try
   if KeyValidation(Key) then frmHddCrawler.AnalyzeJson(aJSONObject,Result)
   else Result.AddPair('error', 'invalid key') ;
  except
   Result.Free;
   raise;
  end;
end;
Einwände?

Geändert von ScharfeMietze ( 3. Feb 2016 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 13:16
Was die Erzeugung der Result-Instanz angeht -> Nein.

Der Rest sieht seltsam aus
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#6

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 13:50
Jap! Zum Testen an sich nutze ich gerne Formen. Vor allem in der Planung. Dann kann ich mir auch mal per button Inhalte ausgeben lassen, oder auch mal eine kleine Testroutine einpflegen.
Oder meintest du was anderes?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: RestServer Antwort Json ohne "[" Klammern

  Alt 3. Feb 2016, 14:08
Auch ...

Du willst doch etwas konkretes frmHddCrawler.Analyze erledigen und übergibst dafür irgendwas TJSONObject .

Delphi-Quellcode:
ICrawlHdd = interface
  function Analyze( request : THddCrawlerRequest ) : THddCrawlerResponse;
end;

function TServerMethods1.updateHddCrawler(Key: string; aJSONObject: TJSONObject): TJSONObject;
var
  request: THddCrawlerRequest;
  response: THddCrawlerResponse;
  error : TErrorResponse;
begin
  // Prüfung ob die Daten im Json zum Aufruf passen
  request := TJson.JsonToObject<THddCrawlerRequest>( aJSONObject );
  try
   if KeyValidation(Key) then
   begin
     // Dienst fragen
     response := HddCrawlerService.Analyze( request );
     try
       // Ergebnis in Json umwandeln
       Result := TJson.ObjectToJsonObject( response );
     finally
       response.Free;
     end;
   end
   else
     begin
       error := TErrorResponse.Create( 'invalid key' );
       try
         Result := TJson.ObjectToJsonObject( error );
       finally
         error.Free;
       end;
     end;
  finally
    request.Free;
  end;
end;
Wer jetzt den ICrawlHdd genau ausführt, kann dir egal sein. Und ob die Daten irgenwann mal per JSON gekommen sind, ist dem Service jetzt auch egal. Der brauchst also kein JSON mehr zu kennen.

Als Service kannst du auch eine Form verwenden:
Delphi-Quellcode:
THddCrawlerForm = class( TForm, ICrawlHdd )
private { ICrawlHdd }
  function Analyze( request: THddCrawlerRequest ): THddCrawlerResponse;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 3. Feb 2016 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz