Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi EEncodingError bei RestRequest.Execute (https://www.delphipraxis.net/191378-eencodingerror-bei-restrequest-execute.html)

Captnemo 9. Jan 2017 13:25

EEncodingError bei RestRequest.Execute
 
Hi,
ich experimentiere gerade ein wenig mit REST und stoße dabei auf folgendes Problem:

Fehlermeldung:
Code:
Im Projekt XYZ.exe ist eine Exception der Klasse EEncodingError mit der Meldung "Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden" aufgetreten.
Server und Client laufen auf dem gleichen System. Kann mir einer sagen, woher dieser Fehler kommt, bzw. was ich falsch mache? (Delphi-Version 10.1)

Servermethode:
Delphi-Quellcode:
var
  a: TJSONArray;
  o: TJSONObject;
  MATKatList: TKategorieList;
  I: Integer;
  s: string;
begin
  MATKatList:=TKategorieList.Create;
  try
    MATKatList.LoadFromDB;
    a:=TJSONArray.Create;
    try
      for I := 0 to MATKatList.Count-1 do
      begin
        o:=TJSONObject.Create;
        o.AddPair('Lfdnr', TJSONNumber.Create(MATKatList[i].Lfdnr));
        o.AddPair('Guid', MATKatList[i].guid);
        o.AddPair('Kategorie', MATKatList[i].Kategorie);
        a.AddElement(o);
      end;
    finally
      Response.ContentType:='application/json';
      s:=a.ToString;
      Response.Content:=s;
      a.DisposeOf;
    end;
  finally
    MATKatList.Free;
  end;
Client-Methode: Hier tritt im RestRequest.Execute der Fehler auf.
Delphi-Quellcode:
var
  a: TJSONArray;
  o: TJSONValue;
begin
  RESTClient1.BaseURL:='http://'+hostname+':'+port;
  RESTRequest1.Resource:='getMATKat';
  RESTRequest1.Method:=TRESTRequestMethod.rmGet;
  RESTRequest1.Response:=frm_ClientMain.RESTResponse1;
  RESTRequest1.Params.Clear;
  RESTRequest1.Execute;                //<---Hier tritt die Exception auf.
  if RESTResponse1.Content<>'' then
  begin
    con1.ExecSQL('Delete from MatKat');
    qry.SQL.Text:='Insert into MatKat (lfdnr, Guid, Kategorie) VALUES (:lfdnr, :guid, :kategorie)';
    a:=TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(RESTResponse1.Content), 0) as TJSONArray;
    for o in a do
    begin
      qry.Params.ParamValues['lfdnr']:=Integer(TJSONObject(o).GetValue('Lfdnr').ToString);
      qry.Params.ParamValues['guid']:=TJSONObject(o).GetValue('Guid').ToString;
      qry.Params.ParamValues['kategorie']:=TJSONObject(o).GetValue('Kategorie').ToString;
      qry.ExecSQL;
    end;
    a.DisposeOf;
  end;

Captnemo 9. Jan 2017 17:38

AW: EEncodingError bei RestRequest.Execute
 
Ich habe mittlerweile herausgefunden, dass die Ursache des Fehler im Server liegen muss. Zwar meldet der Client den Fehler, aber auch der Rest-Debugger liefert diesen Fehler. Und nun gehe ich mal davon aus, dass der wohl nahezu fehlerfrei sein dürfte.
Also wird beim erstellen der Response wohl irgendwas nicht so gemacht, wie der Client das benötigt.
Allerdings finde ich auch im Internet keine Lösung zu dem Problem.

Hat keiner eine Idee?

haentschman 9. Jan 2017 17:45

AW: EEncodingError bei RestRequest.Execute
 
Hallo Captnemo,

Ich hatte den Fehler auch mal. Nur hilft dir das nicht weiter, weil ich mich nicht erinnern kann in welchem Zusammenhang das war... Sorry. :roll: Ich denke an nichts anderes. :wink:

mjustin 9. Jan 2017 18:02

AW: EEncodingError bei RestRequest.Execute
 
Zitat:

Zitat von Captnemo (Beitrag 1358510)
Ich habe mittlerweile herausgefunden, dass die Ursache des Fehler im Server liegen muss. Zwar meldet der Client den Fehler, aber auch der Rest-Debugger liefert diesen Fehler. Und nun gehe ich mal davon aus, dass der wohl nahezu fehlerfrei sein dürfte.
Also wird beim erstellen der Response wohl irgendwas nicht so gemacht, wie der Client das benötigt.
Allerdings finde ich auch im Internet keine Lösung zu dem Problem.

Hat keiner eine Idee?

Auf der Serverseite wird ein Delphi-String als Response verwendet. JSON benutzt normalerweise das UTF-8 Encoding. Kann man z.B. mit einem Browser oder im Debugger sehen, ob der Server tatsächlich UTF-8 oder ein anderes Encoding in der Response angibt?
Ich kenne die Delphi REST Klassen nicht, aber man kann das Encoding sicher auch dort angeben, wo man den ContentType angibt.

Captnemo 9. Jan 2017 19:27

AW: EEncodingError bei RestRequest.Execute
 
Es gibt die Möglichkeit über Response.ContentEncoding hier Einstellungen vorzunehmen.
Ich habe es mit 'UTF-8', 'Identity', 'plain/text' und 'application/json' versucht. Keine Änderunge.

Der ContentType wird ja über die Eigenschaft Respons.ContentType schon als 'application/json' festgelegt. Somit sollte das eigentlich klar sein.

Ich habe das so gemacht, wie es in einem Videotutorial https://www.youtube.com/watch?v=_P6waeTlhVc auch gemacht ist, nachvollzogen.
Allerding ist das unter Seattle.
Und hier auf der Seite http://mijn-design.com/blog/?p=103 wird ja ein Workaround beschrieben, sofern ich das richtig verstanden habe, den ich aber nicht umsetzen kann, weil ich nicht weiß, wo ich die SessionID herkriege. (Wenn's denn überhaupt hilft).

Captnemo 9. Jan 2017 19:34

AW: EEncodingError bei RestRequest.Execute
 
Ich bin grad per Zufall auf eine Lösung gestoßen:

Im Server
Delphi-Quellcode:
      Response.ContentType:='application/json;charset=UTF-8';
Somit wird dann auch der richtige Zeichensatz verwendet, und zumindest der Rest-Debugger erkennt das Response fehlerfrei.


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