Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   REST Service Encoding Escape Sequenz (https://www.delphipraxis.net/209715-rest-service-encoding-escape-sequenz.html)

Rainer Wolff 13. Jan 2022 12:22

REST Service Encoding Escape Sequenz
 
Hallo,

ich habe in C# einen Webservice geschrieben. Dieser gibt in einer Abfrage einen XML String zurück. Wenn ich das Ergebnis mit Swagger oder direkt im Browser anschaue, sieht alles aus, wie gewünscht.
Code:
<?xml version="1.0" encoding="utf-8"?><opc:TypeDictionary
DefaultByteOrder="LittleEndian"
Wenn ich die API jedoch im Embarcadero REST Debugger oder mit den REST-Komponenten in Delphi abfrage, sind etliche Zeichen Escape-codiert ( " wird zu \", Zeilenvorschub wird zu \n ...).
Code:
"<?xml version=\"1.0\" encoding=\"utf-8\"?><opc:TypeDictionary\nDefaultByteOrder=\"LittleEndian\"\nTargetNamespace=\"http:\/\/www.
Aktuell habe ich von dem ganzen REST-Gedöns noch nicht viel Ahnung, verschiedene Versuche mit Inhaltstyp ändern haben nicht zum Erfolg geführt.
Muss ja aber irgendwas damit zu tun haben.

Ich kann das Ergebnis natürlich auf der Delphi-Seite wieder umkonvertieren, aber schön ist anders.

Der schöne Günther 13. Jan 2022 12:48

AW: REST Service Encoding Escape Sequenz
 
Ich glaube die Embarcadero-Komponenten verstehen kein XML, und aus deren Sicht hast du einfach einen String bekommen - Also macht er nochmal Anführungsstriche drum herum und maskiert die Sonderzeichen, wie es sich für einen JSON-String gehört.

So sieht das auf den ersten Blick für mich aus.

Bingo:
Quelle:
https://docwiki.embarcadero.com/RADS...ientbibliothek

Zitat:

In diesem Framework wird JSON als Darstellungsformat verwendet. XML wird nicht explizit unterstützt.

Rolf Frei 13. Jan 2022 12:52

AW: REST Service Encoding Escape Sequenz
 
REST ist aber JSON basiert und nicht XML. Lieferst du das XML als Teil eines JSON Objekts? Ist dem so, ist das absolut normal, da diese Zeichen in JSON escaped sein müssen. Du musst das JSON noch mit einem JSON-Parser verarbeiten und in ein Delphi Objekt wandeln, z.B. mit REST.JSON.pas.

Oder ist dein Webservice garkein REST-Server sonderne eine SOAP Server? Dieser liefert XML. Dann brauchst du aber auf Delphi Seite auch einen SOAP-Client und nicht den REST-Client.

EDIT:
Habe eben gelsen, dass REST auch XML liefern kann. Ich würde dir aber davon abraten. JSON ist die "Standard" Antwort in REST. Ich kenne keinen einzigen Webservice der da XML liefert. Das ist mit XML alles viel zu überblasen und mit JSON einfach viel einfacher und platz-/rechensparender.

Uwe Raabe 13. Jan 2022 13:16

AW: REST Service Encoding Escape Sequenz
 
Zitat:

Zitat von Rolf Frei (Beitrag 1500542)
Habe eben gelsen, dass REST auch XML liefern kann. Ich würde dir aber davon abraten. JSON ist die "Standard" Antwort in REST. Ich kenne keinen einzigen Webservice der da XML liefert.

Genau dafür gibt es ja den erwarteten ContentType im Accept Property (TRESTClient oder TRESTRequest). Der Server sollte sich dann halt danach richten und das passende oder eine Fehlermeldung liefern.

Das XML sollte im Response.Content auch korrekt ankommen. Lediglich der RESTDebugger ist stark JSON-lastig

Rainer Wolff 13. Jan 2022 14:27

AW: REST Service Encoding Escape Sequenz
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1500541)
Ich glaube die Embarcadero-Komponenten verstehen kein XML, und aus deren Sicht hast du einfach einen String bekommen - Also macht er nochmal Anführungsstriche drum herum und maskiert die Sonderzeichen, wie es sich für einen JSON-String gehört.

So sieht das auf den ersten Blick für mich aus.

Wird dann vielleicht auch so sein. Danke für die Hilfen.

Ich habe jetzt kurz und schmerzlos doch die Umkonvertierung auf Delphi-Seite mit String-Replace reingefummelt. Die Funktion wird bei Programmstart ein einziges mal aufgerufen, dann isses halt nicht schön, aber funktioniert.

JSON als Standardantwort: Ich bekomme den XML-String schon fertig aus einer untergeordneten Schnittstelle und reiche den in meinem Rest-Server nur als String an die Delphi-App weiter.

Der schöne Günther 13. Jan 2022 14:43

AW: REST Service Encoding Escape Sequenz
 
Hauptsache ein paar Unit-Tests decken das vernünftig ab. Dann darf man da drinnen einiges an unschönen Dingen treiben.

So meine Meinung und so.

Incocnito 13. Jan 2022 14:46

AW: REST Service Encoding Escape Sequenz
 
Ich befürchte StringReplace ist ein gefährlich falscher Ansatz.
Notfalls eher (vom Prinzip her) sowas:

Delphi-Quellcode:
type
  TWhatEver = class
    FText : String;
  end;
...
function ConvertMe(sVal : String) : String;
var
  obj : TWhatEver;
begin
  try
    obj := TJson.JsonToObject<TWhatEver>('{"text":' + sVal + '}');
    try
      Result := obj.FText;
    finally
      obj.Free();
    end;
  except
    Result := '';
  end;
end;
Obwohl das auch schon echt bäh ist!
Und bitte nochmal drüber schauen.

LG Incocnito

freimatz 17. Jan 2022 13:37

AW: REST Service Encoding Escape Sequenz
 
Zitat:

Zitat von Rolf Frei (Beitrag 1500542)
REST ist aber JSON basiert und nicht XML.

Der Aussage würde ich so widersprechen. Zumindest sollte man dann definieren was man unter REST versteht.
Nach meiner Definition (m.E. und auch wikipedia) hat das Format nichts mit REST zu tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz