[Gelöst] HttpContent bei Response ohne Sonderzeichen (BC19)

13. Januar 2023 15:29

Hallo,

wenn ich eine Abfrage an einen Webserver sende bekomme ich als Antwort einen HtpContent als Response was am Ende eine JSON ist.
Code:
{
          "name": "ST\u00dcCK",
          "apiAlias": "property_group_option"
        },


Komisch ist das ich bei den Antworten anstelle von Sonderzeichen wie ä,Ä,ö,Ö, etc. diese UniCodes "\u00dc" zurück bekomme.
Meine Requests die ich mit Sonderzeichen schicke kommen auf dem Webserver auch sauber an und werden dort korrekt dargestellt. Deswegen verstehe ich das nicht das der Response so zurück bekommt.

Hat jemand von euch eine Idee?
Zuletzt geändert von Aquator am 18. Januar 2023 13:44, insgesamt 2-mal geändert.

Re: HttpContent bei Response ohne Sonderzeichen

16. Januar 2023 11:16

Das ist ja normale UTF-8 Daten. Kann Business Central das nicht decodieren?
Wenn doch hat einer eine Idee wie ich das machen kann?

Re: HttpContent bei Response ohne Sonderzeichen

16. Januar 2023 13:35

Vorgabe für Ex-und Import ist weiterhin Codepage OEM 850 (MS-DOS) aus historischen Gründen. UTF-8,UTF-16 oder Windows (ANSI 1252) muss man einstellen.
File Handling and Text Encoding

Wie liest du die JSON-Datei denn ein? Mit DataType HttpContent?
HttpContent.ReadAs(var InStream) Method
Etwas mehr Quellcode wäre hilfreich :wink: .

Re: HttpContent bei Response ohne Sonderzeichen

17. Januar 2023 11:07

Danke für deine Antwort.

Ich lese mit HttpContent ein.

Also zuerst erstelle ich eine Anfrage, sende die anden Webserver und bekomme dann nach dem HttpClient.Send eine Antwort (Response) in form von einer HttpResponseMessage. Aus der hole ich mir per HttpResponseMessage.Content den HttpContent.
Diesen lese ich dann an anderer stelle weiter aus mit HttpContent.ReadAs(Text).
Ich hatte es auch schon mit einem InStream probiert aber leider ohne Erfolg. Bzw. kam am Ende immer das selbe raus. Kann aber auch gut sein das ich hier was falsch gemacht habe.

Der folgende Code ist mal etwas minimalisiert. Sollte den Ablauf aber deutlich machen.
Code:
...
Request.GetHeaders(RequestHeaders);
RequestHeaders.Add('accept', 'application/json');

ContentHeaders.Remove('Content-Type');
ContentHeaders.Add('Content-Type', 'application/json');
ContentHeaders.Add('Content-Length', Format(StrLen(RequestContentBody), 0, 9));

Content.WriteFrom(g_BufferInStream);
Request.Content := Content;

Client.Send(Request, Response);

RequestedContent := Response.Content;
RequestedContent.ReadAs(ResponseText);

Re: HttpContent bei Response ohne Sonderzeichen

17. Januar 2023 12:08

Bitte noch im Titel angeben, auf welche Version (BC14, BC15, ...) sich die Frage bezieht!

Dieser Workaround könnte helfen. Den InStream mit UTF-8 Encoding in ein Blob schreiben und dann daraus auslesen.
https://github.com/microsoft/AL/issues/ ... -447003909

Re: HttpContent bei Response ohne Sonderzeichen (BC19)

17. Januar 2023 14:56

Sorry die Version hatte ich vergessen und nachgebessert.

Sowas habe ich schon probiert. Habes es noch einmal nachgestellt mit der Codeunit Tempblob.
Egal was ich als Encoding angebe ... es bleibt wie es ist.

Ich habe mittlerweile einen zweckmäßigen workarround gebaut. Nicht schön, aber damit ich mit meiner Arbeit erst einmal weiter komme.

Code:
Unicodes: Record "Name/Value Buffer" temporary;
...
Unicodes.AddNewEntry('\u00e4', 'ä');
        Unicodes.AddNewEntry('\u00c4', 'Ä');
        Unicodes.AddNewEntry('\u00f6', 'ö');
        Unicodes.AddNewEntry('\u00d6', 'Ö');
        Unicodes.AddNewEntry('\u00fc', 'ü');
        Unicodes.AddNewEntry('\u00dc', 'Ü');
        Unicodes.AddNewEntry('\u00df', 'ß');
        if Unicodes.FindFirst() then begin
            repeat
                RequestedContentText := RequestedContentText.Replace(Unicodes.Name, Unicodes.Value);
            until Unicodes.Next() = 0;
            if StrPos(RequestedContentText, '\u') > 0 then
                Error('There is still Unicode in the response body.');
        end;


Muss doch aber auch was auf eleganten Wege geben?

Re: HttpContent bei Response ohne Sonderzeichen (BC19)

17. Januar 2023 15:52

Das Verhalten, aus den Sonderzeichen Unicodepoints zu machen, ist die Vorgabe von System.Text.Json.
In .NET bekommt man das leicht weg, aber .NET sollte man ja möglichst vermeiden, falls man irgendwann auf SaaS umstellen möchte :wink: .
How to customize character encoding with System.Text.Json
Compare Newtonsoft.Json to System.Text.Json, and migrate to System.Text.Json

Ist Data Type JsonObject auch mit im Einsatz?
Alternativ gibt es Codeunit 1234 "Json Text Reader/Writer", in AL bzw. C/AL.
darin Funktion ReadJSonToJSonBuffer.

https://httpbin.org ist übrigens eine schöne Site zum Testen.

[Nachtrag]: Hier wird von Saurav Dhyani mit JsonObject und JsonToken gearbeitet, das funktioniert bei mir einwandfrei.
https://github.com/postsaurav/Json-Import-Export/tree/main/src/codeunits

Re: HttpContent bei Response ohne Sonderzeichen (BC19)

18. Januar 2023 10:39

Kowa hat geschrieben:falls man irgendwann auf SaaS umstellen möchte :wink: .

Das wird absehbar nicht bei uns passieren. Solange es OnPrem gibt bleiben wir dabei.
Jedoch versuche ich immer soweit es geht auf die .NET sachen zu verzichten.

Kowa hat geschrieben:Ist DataType Json Object auch mit im Einsatz?

Jau ist auch dabei. Erst einmal natürlich bekomme ich von dem Request einen Text/InStream der dann aber in ein Json Objekt gelesen wird.
Aber du hast mich hier auf die Lösung gebracht. Es war wiedermal der Fehler der Text Variablen.
Ich habe den Response immer in einer Text Variablen übergeben und dann halt weiter verarbeitet.
Code:
Response.Content.ReadAs(ResponseText);
JsonObject.ReadFrom(ResponseText);

... geht nicht, bzw hat diese Unicodezeichen.
Ich muss mir echt angewöhnen mehr mit den Streams zu arbeiten.
Code:
Response.Content.ReadAs(InStream);
JsonObject.ReadFrom(InStream);

... geht und hat z.B. ein Ü bei STÜCK.

Vielen vielen Dank @Kowa!!!

Re: HttpContent bei Response ohne Sonderzeichen (BC19)

18. Januar 2023 10:48

Hallo Aquator,

wenn deine Frage zufriedenstellend beantwortet wurde, wäre es sehr nett von dir, wenn du deinen ursprünglichen Beitrag editierst und [Gelöst] vor den Titel schreibst.
So sehen andere Besucher dieser Community schon in der Themenübersicht und/oder den Suchergebnissen, ob es für dieses Thema eine Lösung gibt.

Vielen Dank für deine Mithilfe.

Gruß, Kowa
MSDynamics.de-Team

Re: [Gelöst] HttpContent bei Response ohne Sonderzeichen (BC

18. Januar 2023 13:45

Gemacht ;-)