AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FritzBox auslesen - Problem SOAP-Abfrage

Ein Thema von TERWI · begonnen am 25. Sep 2025 · letzter Beitrag vom 26. Sep 2025
Antwort Antwort
Seite 2 von 2     12   
mjustin

Registriert seit: 14. Apr 2008
3.017 Beiträge
 
Delphi 2009 Professional
 
#1

AW: FritzBox auslesen - Problem SOAP-Abfrage

  Alt 25. Sep 2025, 14:13
Delphi-Quellcode:
   Content : TStringList;

...
    result := HTTP.Post(url, Content);
Da liegt der Fehler: es muss für XML oder JSON hier keine Stringlist sondern ein Stream übergeben werden.

Siehe hier: https://blog.habarisoft.com/2015/03/...-6-https-post/

"you must not use a TStringList for the POST body. That version of TIdHTTP.Post() formats the data according to the application/x-www-form-urlencoded media type, which is not appropriate for JSON and will corrupt it."


Delphi-Quellcode:
RequestBody: TStream;
ResponseBody: string;
...

RequestBody:= TStringStream.Create(Content.Text, TEncoding.UTF8);

ResponseBody := HTTP.Post(url, RequestBody);
Michael Justin

Geändert von mjustin (25. Sep 2025 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
388 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FritzBox auslesen - Problem SOAP-Abfrage

  Alt 25. Sep 2025, 15:04
Zu diesem Thema habe ich auch schon einiges, nicht wirklich erquickendes zur Lösung gefunden.
TStringlist funktionert mit POST auch betreff XML einwandfrei.
TStringStream in andere Art & Weise mglw. sicher auch - 2 Wege - ein Ziel ?!
Generelles Lesen von XML-Daten aus Box(en) funktioniert hier ja problemlos !
LUA-scripts, TR-064-Daten, XMLs aus (uPnP) SSDP und SCPD-Daten daraus lesen ist nicht das Thema !

.... einzig dieser SOAP-Gerümpel macht mir Kopfschmerzen.

Geändert von TERWI (25. Sep 2025 um 15:10 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.017 Beiträge
 
Delphi 2009 Professional
 
#3

AW: FritzBox auslesen - Problem SOAP-Abfrage

  Alt 25. Sep 2025, 15:18
Zu diesem Thema habe ich auch schon einiges, nicht wirklich erquickendes zur Lösung gefunden.
TStringlist funktionert mit POST auch betreff XML einwandfrei.
Nein, das ist nicht der Fall. In https://blog.habarisoft.com/2015/03/...-6-https-post/ habe ich auf die Antwort eines Indy-Entwicklers verlinkt (https://stackoverflow.com/a/28493431/80901):

Zitat:
You are using the wrong version of Post() to begin with.

You are using the overloaded version of Post() that accepts a TStrings as input. That version is intended for posting HTML webforms in application/x-www-form-urlencoded format, where the TStrings is expected to contain name=value strings that get encoded according to W3C's rules for submitting webforms. That is why you are seeing your XML being encoded the way it is.
Michael Justin

Geändert von mjustin (25. Sep 2025 um 15:20 Uhr) Grund: URL ergänzt
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.077 Beiträge
 
Delphi 12 Athens
 
#4

AW: FritzBox auslesen - Problem SOAP-Abfrage

  Alt 25. Sep 2025, 15:34
Evtl noch eine sache du Gibst ein Soap 1.1 encoding im Envelope an, aber du verwendest einen präfix "s:" der erst ab Soap 1.2 gebräuchlich war...
offiziell ist der Präfix zwar egal...aber manchmal sind parser auch falsch implementiert und erwarten ganz bestimmte präfixe wie "SOAP-ENV:" "soap:" "soapenv:" oder "env:"
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
388 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: FritzBox auslesen - Problem SOAP-Abfrage

  Alt Gestern, 09:42
@Michael --- 1000 DANK ! YEPP - funzt !

TStringStream statt TStringList macht den elementaren Unterschied.
Insbesondere m.E.n. das UTF-8 Encoding der "Seifenschachtel" ?!
Vermutung: Neben der Ansage via ContentType das UTF-8 kommt, muss das bei SOAP anscheinend auch machen.
Beim lesen von Desription's und zugehörigen SCPD-Dateien via XML scheint das offensichtlich unkritisch.
Das hier funktioniert nun tadellos:
Delphi-Quellcode:
function TDATA.Read_SOAP(Path, Service, Action : string): string;
var url : string;
    HTTP : TIdHTTP;
    SoapReq : string;
    SoapStream : TStringStream;
begin
  result := '?';
  url := Format('http://%s:%d%s', [FBoxAct^.IP, cFB_PORT_TCP, Path]);
  Log('Read_SOAP', url);
  SoapReq := '<?xml version="1.0" encoding="utf-8"?>' +
             '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" ' +
               'xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
             '<s:Body>' +
             Format('<u:%s xmlns:u=%s></u:%s>', [Action, Service, Action]) +
             '</s:Body>' +
             '</s:Envelope>';
  try
    SoapStream := TStringStream.Create(SoapReq, TEncoding.UTF8);
    HTTP := TIdHTTP.Create(nil);
    HTTP.Request.ContentType := 'text/xml';
    HTTP.Request.Charset := 'utf-8';
    HTTP.Request.CustomHeaders.Values['SOAPAction'] := Format('%s#%s', [Service, Action]);
    result := HTTP.Post(url, SoapStream); // Content);
  except
    on E: EIdHTTPProtocolException do
      Log('Read_SOAP', 'ERROR: ' + inttostr(E.ErrorCode) + ' |' + E.ErrorMessage);
  end;
  SoapStream.free;
  HTTP.Free;
end;
Wie erwartet kommt das zurück:
Code:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetSecurityPortResponse xmlns:u="urn:dslforum-org:service:DeviceInfo:1">
<NewSecurityPort>49443</NewSecurityPort>
</u:GetSecurityPortResponse>
</s:Body>
</s:Envelope>
Basis ist da - schaue ich mal, ob SSL notwendig ist und wie es sich beim schreiben via SOAP verhält.
Insbesondere bei notwendigem Login und Übergabe notwendiger Daten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 21:40 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