Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   REST-Server Aufruf ohne Parameter -> Access violation (https://www.delphipraxis.net/188276-rest-server-aufruf-ohne-parameter-access-violation.html)

Starsky911 16. Feb 2016 10:47

REST-Server Aufruf ohne Parameter -> Access violation
 
Hallo,

ich habe einen REST-Server erstellt, über den ich eine Servermethode mit zwei
Parametern definiert habe.

Delphi-Quellcode:
type
{$METHODINFO ON}
  TServerMethods1 = class(TDataModule)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function KundeListe(action: string; jObject: TJSONObject): TJSONObject;
  end;
{$METHODINFO OFF}
   
function TServerMethods1.KundeListe(action: string; jObject: TJSONObject): TJSONObject;
var
  s: string;
begin
  if Assigned(jObject) then begin
    if not jObject.Null then begin
     s:=jObject.ToString; <<<-- Access violation bei Aufruf2
     //...
   end;
  end;
end;
Aufruf über Webbrowser:

Aufruf1: localhost:8080/datasnap/rest/TServerMethods1/"KundeListe"/read//
Aufruf2: localhost:8080/datasnap/rest/TServerMethods1/"KundeListe"/read/

Der erste Aufruf funktioniert einwandfrei.
Bei dem zweiten Aufruf fehlt der zweite Parameter was dazu führt das
es zum Access violation kommt.
Eigenartig ist auch, dass "jObject.Null" im Debugger True anzeigt aber
trotzdem in der If-Schleife rein geht.
Irgendwie scheint das jObject einen undefinierten Zustand zu haben.
Gibt es irgendwie eine Möglichkeit den zweiten Parameter auf Gültigkeit
zu prüfen?
Vielen Dank im voraus.

Gruß
Starsky

mkinzler 16. Feb 2016 11:01

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Wie ist toString implementiert?

Starsky911 16. Feb 2016 11:58

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
toString ist eine Function aus dem Object TJSONObject aus der Unit System.JSON
Aber auch wenn ich die Funktion jObject.Count oder jObject.Size aufrufe
bekomme ich auch einen Access Violation.:cry:

Sir Rufo 16. Feb 2016 12:11

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Dann schau doch mal über den Debugger, wer diese Instanz erzeugt hat (durch den Callstack zurückgehen).

Da gibt irgendetwas wohl eine nicht initialisierte lokale Referenzvariable durch ;)

Starsky911 16. Feb 2016 12:51

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es ist eine Datasnap-Rest-Anwendung die über
den Assistenten von Delphi XE7 erstellt wurde.
Der Aufruf Stack.

Sir Rufo 16. Feb 2016 13:39

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Du hast den Callstack gefunden :thumb:

Jetzt brauchst du nur noch dich von oben nach unten durchklicken und schauen, wer diese Instanz erzeugt (bzw. erzeugen sollte).

Dann einen Breakpoint an den Anfang dieser gefundenen Methode, nochmals aufrufen und schauen, warum die Instanz nicht erzeugt wird.

Starsky911 16. Feb 2016 14:15

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Warum die Instanz/Parameter nicht erzeugt wird, weiss ich ja.
Weil der zweite Parameter im Aufruf2 nicht mitgegeben wurde (der letzte Slash fehlt im Aufruf2).
Gibt es die Möglichkeit aus der ServerMethode heraus die Aufruf URL abzufragen?

Wenn ich mich im Aufruf Stack durchklicke bekomme ich die CPU-Ansicht
mit Assembler Quellcode:cry:

Sir Rufo 16. Feb 2016 14:22

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Ich denke dass ist uns allen klar, warum da keine Instanz erzeugt wird.

Unklar ist aber, warum dort ein dangling pointer übergeben wird und eben kein
Delphi-Quellcode:
nil
.

Hast du auch mit den Debug-DCU kompiliert?

hoika 16. Feb 2016 23:09

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
Hallo,

kannst du das nicht so definieren

Delphi-Quellcode:
function KundeListe(action: string; jObject: TJSONObject = nil): TJSONObject;
oder gleich
Delphi-Quellcode:
function KundeListe(action: string = nil; jObject: TJSONObject = nil): TJSONObject;

Heiko

Starsky911 17. Feb 2016 10:25

AW: REST-Server Aufruf ohne Parameter -> Access violation
 
@Sir Rufo
Danke für den Tipp mit Debug-DCU.
Dadurch konnte ich mich durch den Stack durchklicken.
Allerdings sind die Routinen in System.JSON doch sehr komplex.

@Heiko
Die Declaration mit TJSONObject = nil hat leider nicht geholfen.

Mir ist allerdings aufgefallen, dass die Variable jObject zwar gültig
war aber die private Variable FMembers=nil war.
Ich habe mir eine Helper Class erstellt um die private Variable
auf nil zu testen und es funktioniert.

Vielen Dank an alle...:-D

Gruß
Starsky


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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