AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy HTTPClient Post umlaute

Indy HTTPClient Post umlaute

Ein Thema von DelTurbo · begonnen am 16. Apr 2024 · letzter Beitrag vom 21. Apr 2024
Antwort Antwort
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#1

AW: Indy HTTPClient Post umlaute

  Alt 16. Apr 2024, 16:12
@jaenicke,

Wandel ich es in UTF-8 um, bekomme ich z.b. statt L?nge, L??nge zurück.
Hab ich doch schon versucht.
Ich kann das nicht reproduzieren. Wenn ich den Text als UTF-8 schicke, kommt der auch mit Umlauten an. Auf dem Server habe ich das print_r verwendet wie du es geschrieben hast.
Delphi-Quellcode:
var
  Http: TIdHTTP;
  Data: TStringList;
begin
  Http := TIdHTTP.Create(Self);
  try
    Data := TStringList.Create;
    try
      Data.Add('{ "q": "Länge 8,5 cm","source": "de", "target": "en", "api_key": "#####"}');
      ShowMessage(Http.Post('http://www.familie-jaenicke.de/b.php', Data, IndyTextEncoding_UTF8));
    finally
      Data.Free;
    end;
  finally
    Http.Free;
  end;
end;
Da du keinen Quelltext gezeigt hast, kann ich auch nicht beurteilen, was bei dir falsch läuft.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (16. Apr 2024 um 16:14 Uhr)
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#2

AW: Indy HTTPClient Post umlaute

  Alt 16. Apr 2024, 16:15
So wie ich gelesen habe, bin ich nicht der einzige mit diesem Fehler. Du hast eine andere Indy Version als ich. z.b. bei Delphi 2009 soll der Bug noch drin gewesen sein. Quelle der Info: https://entwickler-forum.de/forum/ar...te-mit-indy-10

Aber mit OverByte ging es sofort. Deswegen.......
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#3

AW: Indy HTTPClient Post umlaute

  Alt 16. Apr 2024, 23:05
So wie ich gelesen habe, bin ich nicht der einzige mit diesem Fehler. Du hast eine andere Indy Version als ich. z.b. bei Delphi 2009 soll der Bug noch drin gewesen sein.
Ich habe es eben mit Delphi 2007 ausprobiert. Es ging ebenfalls sofort:
Delphi-Quellcode:
var
  Http: TIdHTTP;
  Data: TStringList;
begin
  Http := TIdHTTP.Create(Self);
  try
    Data := TStringList.Create;
    try
      Data.Add('{ "q": "Länge 8,5 cm","source": "de", "target": "en", "api_key": "#####"}');
      ShowMessage(Http.Post('http://www.familie-jaenicke.de/b.php', Data));
    finally
      Data.Free;
    end;
  finally
    Http.Free;
  end;
end;
Wie schon geschrieben: Ohne deinen Code kann man dir auch nur sehr schlecht helfen. Darum ist es immer am besten ein Beispielprojekt oder Beispielcode zu zeigen, mit dem du es versucht hast...

ICS ist eine gute Wahl, aber mit Indy geht es auch.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 00:50
Es ging ebenfalls sofort:
Vielleicht wäre es auch gut zu klären, wie der Input Server seitig verarbeitet wird.
Dein Code läuft mit deiner URL/deinem PHP Skript super und ä kommt an. Wenn man aber den Code zum Beispiel auf 'http://httpbin.org/post' loslässt, dann gibt der Server ä Unicode codiert zurück:
"{ \"q\": \"L\u00e4nge 8,5 cm\",\"source\": \"de\",
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#5

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 05:43
Eben das ist der Punkt. Wenn man nicht weiß, wie der Quelltext aussieht, kann man nicht sagen, woran es liegt. Wenn ich ein konkretes Beispiel habe, kann ich sehen oder auch testen was raus geht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#6

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 09:30
"{ \"q\": \"L\u00e4nge 8,5 cm\",\"source\": \"de\",
Das nimmt er nicht an. Er will das wirklich so wie ich geschrieben hatte.

Hier der Code, also der Kern. Alles zu posten ist was lang.
Indy:
Delphi-Quellcode:
    pdata:=TStringList.Create;
    for i:=0 to memoPost.Lines.Count-1 do begin
      pdata.Add(UTF8Encode(memoPost.Lines.Strings[i]));
    end;
    try
      line:=HTTPClient.Post(URL,pdata);
    except
      i:=1;
    end;
    memoAnswer.Lines.Text:=line;
ICS:
Delphi-Quellcode:
    SndStrm := TMemoryStream.Create;
    RcvStrm := TMemoryStream.Create;
    Data := UTF8Encode(memoPost.Lines.Text);
    HttpCli1.SendStream := SndStrm;
    HttpCli1.SendStream.Write(Data[1],Length(Data));
    HttpCli1.SendStream.Seek(0,0);
    HttpCli1.RcvdStream := RcvStrm;
    HttpCli1.URL := URL;
    HttpCli1.Post;
    RcvStrm.Position:=0;
    memoAnswer.Lines.LoadFromStream(RcvStrm);
    memoAnswer.Lines.Add('....');
    RcvStrm.Free;
    SndStrm.Free;
ICS ging auf anhieb. Und wie gesagt ich denke das ich die gebuggte Version von Indy habe. Ich habe vor Jahren mal Indy 10.6.0 Installiert. Nun wo man es weiß, sollte ich das mal updaten. Man kann ja auch mit Wireshark sehen das Indy das falsch übergibt. Indy macht ja die ? rein.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#7

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 12:29
Das stimmt, mit dem UTF8Encode kommt es falsch an. Es sei denn ich lese es auf dem Server auch wieder als UTF-8 ein:
Delphi-Quellcode:
<?php
print_r(mb_convert_encoding($_POST, 'ISO-8859-1', 'UTF-8'));
?>
Der Grund ist simpel:
Du kodierst es zwar als UTF-8, teilst das aber nicht mit. ICS wiederum verwendet UTF-8 Encoding als Standard, weshalb du das dort nicht explizit setzen musst.

Korrekt mit Indy ist daher:
Delphi-Quellcode:
    pdata:=TStringList.Create;
    for i:=0 to memoPost.Lines.Count-1 do begin
      pdata.Add(UTF8Encode(memoPost.Lines.Strings[i]));
    end;
    try
      HTTPClient.Request.ContentEncoding := 'UTF-8';
      line:=HTTPClient.Post(URL,pdata);
    except
      i:=1;
    end;
    memoAnswer.Lines.Text:=line;
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.245 Beiträge
 
Delphi 2007 Architect
 
#8

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 13:18
Hi, bitte steck da keine Zeit mehr rein.

HTTPClient.Request.ContentEncoding := 'UTF-8';

Das habe ich alles versucht. Bevor ich hier Frage, kannst du davon ausgehen das ich mind. 2 Tage versuche das selber zu lösen. Und ja, das php gibt UTF-8 zurück und nimmt es an.

Ich danke dir trotzdem Tausend mal für deine Hilfe und mühe.
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Indy HTTPClient Post umlaute

  Alt 17. Apr 2024, 17:05
Delphi-Quellcode:
procedure libretranslate_Indy;
var
    json : rawbytestring;
    line : WideString;
    Stream: TStream;
begin
    Stream := TMemoryStream.Create;
   try
    json := UTF8Encode('{ "q": "anöa","source": "auto", "target": "en", "api_key": ""}');
    Stream.WriteBuffer(Pointer(json)^, Length(json));
    Stream.Position := 0;
    form103.idhttp1.Request.ContentType := 'application/json';
    line := UTF8Decode(form103.idhttp1.Post('http://127.0.0.1:5000/translate',stream));
  // line:=form103.idhttp1.Post('http://httpbin.org/anything',pdata);
    Showmessage( line );
   finally
    stream.Free;
   end;
end;
jaenicke ich habe libretranslate lokal installiert (und Fiddler fürs Vergleichen von Header und Daten und...) und da führt dein Code beim "Post" zu einem Bad Request oder einem Method not allowed. Eventuell mache ich was falsch. - Ich glaube aber, dass der Code oben funktionieren sollte. Bei mir werden die Sonderzeichen im Response als Sonderzeichen angezeigt.

Sogar das funktioniert: json := UTF8Encode('{ "q": "أرى الكلب الأزرق الصغير خلف المنزل الأصفر على النهر الأحمر.","source": "auto", "target": "en", "api_key": ""}');
Michael Gasser

Geändert von Michael II (18. Apr 2024 um 00:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:19 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