PHPArray über Indy HTTP Post übergeben?
Wie übergebe ich ein doppeltes Array(PHPArray) über HTTP mit Delphi?
PHPCode:
Code:
Mein Delphi Code:
$variable = array(
array( "Test1", "Test2" ), array( "Test3", "Test4" ), array( "Test5", "Test6" ) );
Code:
Verwende Delphi XE10
procedure PostHTTP;
var ParamList: TStringList; begin ParamList := TStringList.Create; ParamList.Add('Param1=???'); // dort gehört das doppelte PHPArray rein IdHTTP.Post('http://www.abc.com/api.php', ParamList)); ParamList.Free; end; |
AW: PHPArray über Indy HTTP Post übergeben?
Das hat an sich überhaupt nichts mit Delphi zu tun. HTTP bzw. PHP stellt sich schon bei eindimensionalen Arrays sehr seltsam an (Parameter müssen auf [] enden) und für zweidimensionale dürfte kein Standard in HTTP existieren (somit ist das auch keine Frage zu PHP). Ich würde daher vermuten, dass du dir dein eigenes Format überlegen musst, das du in Delphi zusammensetzen und in PHP parsen musst. Entweder ein einzelner Parameter (z.B. CSV als Payload) oder eindimensionale Array-Parameter mit einer Kommaliste je Wert oder so. Escaping nicht vergessen.
|
AW: PHPArray über Indy HTTP Post übergeben?
PHP gegenstelle ist eine API, ich bin da nur der Client!
Ich habe oben nur gezeigt wie es unter PHP aussieht, nur wie setze ich das eben in Delphi um? |
AW: PHPArray über Indy HTTP Post übergeben?
Wenn man das hier auf mehrere Dimensionen erweitert, könnte es klappen. Für dein Beispiel wäre dies:
Code:
oder
variable[0][]=Test1&variable[0][]=Test2&variable[1][]=Test3&variable[1][]=Test4&variable[2][]=Test5&variable[2][]=Test6
Code:
Du kannst auch PHP selbst fragen: http_build_query, dann sagt dir PHP, wie das aussehen muss, wenn man das nativ macht ($_POST['variable'] ist dein Array). Das könnte/sollte/müsste der zweite Code sein, der erste würde vielleicht auch gehen, dann übernähme PHP das Zuweisen von Indizes in den inneren Arrays. Wenn die API jetzt natürlich CSV- oder JSON-Payload erwartet, wäre das blöd. Dann hülfe nur ein Mitschnitt der Kommikation.
variable[0][0]=Test1&variable[0][1]=Test2&variable[1][0]=Test3&variable[1][1]=Test4&variable[2][0]=Test5&variable[2][1]=Test6
Wie gesagt, hat mit Delphi absolut gar nichts zu tun. |
AW: PHPArray über Indy HTTP Post übergeben?
Danke @Redeemer!
Du hast mich auf die Löasung gebracht! Eigentlich eh ganze easy.
Code:
Das mit & ging nicht, denke das wird nur über querys in der url via GET funktionieren.
procedure PostHTTP;
var ParamList: TStringList; begin ParamList := TStringList.Create; ParamList.Add('Param1[0][0]=bla'); ParamList.Add('Param1[1][0]=blabla'); // usw. IdHTTP.Post('http://www.abc.com/api.php', ParamList)); ParamList.Free; end; |
AW: PHPArray über Indy HTTP Post übergeben?
Indy escapet das wohl einfach, wenn du mehrere Parameter in einen reinpackst. Sprich & wird zu %26.
|
AW: PHPArray über Indy HTTP Post übergeben?
Vielleicht ist JSON in diesem Fall interessant - denn sowohl Delphi als auch PHP verstehen das einwandfrei.
Delphi-Dokumentation: http://docwiki.embarcadero.com/RADStudio/Rio/de/JSON JSON zu PHP-Array in PHP umwandeln: https://www.php.net/manual/de/function.json-decode.php Zudem empfehle ich das an den Server per POST zu übermitteln und nicht per URL/GET. Hier mal etwas pseudo code:
Delphi-Quellcode:
Viele Grüße
uses JSON, JSON.Types, JSON.Writers, JSON.Builders, Wininet;
procedure post; var inetSession, inetConnection, inetRequest: HINTERNET; js, jsElement: TJSONObject; JSarray: TJSONArray; Parameter:String begin if inetSession = nil then inetSession := InternetOpen(PChar('Delphi App'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if inetSession = nil then RaiseLastOSError; if inetConnection = nil then inetConnection := InternetConnect(inetSession, PChar('###URL z.B.: www.demo.de ###'), INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1); if inetConnection = nil then RaiseLastOSError; inetRequest := HttpOpenRequest(inetConnection, PChar('POST'), nil, nil, nil, nil, INTERNET_FLAG_SECURE, 1); if inetRequest = nil then RaiseLastOSError; //JSON aufbauen js := TJSONObject.Create; JSarray := TJSONArray.Create; jsElement := TJSONObject.Create; try js.AddPair(TJSONPair.Create('Propertyname', 'ABC')); jsElement.AddPair(TJSONPair.Create('arrayElement', TJSONNumber.Create(10))); JSarray.AddElement(jsElement); js.AddPair(TJSONPair.Create('array', JSarray)); Parameter := js.ToJSON; finally jsElement.free; JSarray.free; js.free; end; //JSON posten if not HttpAddRequestHeaders(inetRequest, PChar(Header), Length(Header), HTTP_ADDREQ_FLAG_ADD) then RaiseLastOSError; if not HTTPSendRequest(inetRequest, nil, 0, PAnsiChar(AnsiString(Utf8Encode(Parameter))), length(Utf8Encode(Parameter))) then RaiseLastOSError; end; |
AW: PHPArray über Indy HTTP Post übergeben?
Zitat:
|
AW: PHPArray über Indy HTTP Post übergeben?
Die Frage ist ja nur wie diese Parameter genau aufgebaut sein müssen. Mit PHP hat das erstmal nichts zu tun. PHP ist eine reine Server Spache und da werden per HTTP nur Parameter HTTP-konform übergeben. Was dann serverseitig PHP damit macht, müssen wir nicht wissen. Wir müssen einfach nur wissen wie diese Parameter aufgebbaut sein müssen und da nützt uns eien PHP array erstmals garnichts, da das nichts mit HTTP zu tun hat.
Gibt es denn da keine Doumentation dazu, wenn du da eine existierende Schnittstelle nutzen musst. Gibt es eine funktionierende Demowebsite bei denen? Wenn ja, schau dir mal an wie da die HTTP-Parameter vom Browser übergeben werden (F12 Entwicklertools). Wenn du das mal weisst, ist der Rest ein Kinderspiel. |
AW: PHPArray über Indy HTTP Post übergeben?
Zitat:
|
AW: PHPArray über Indy HTTP Post übergeben?
Sorry wegen meines späten Feedbacks.
Mein Problem ist gelöst. Siehe letzter Post von mir ! Ich hatte ja ein Sample von der Schnittstelle nur eben in PHP. Habe das eh via POST gesendet und nicht mit GET. GET ist angeblich auf 255 Zeichen beschränkt. |
AW: PHPArray über Indy HTTP Post übergeben?
Zitat:
PS: Bei GET ist zu beachten, dass diese Aufrufe gern im Log landen und monatelang gespeichert bleiben (z.B. beim Apache), wo es dann natürlich besser wäre Wichtiges, wie z.B. Passwörter, per POST zu übergeben, anstatt per GET. :stupid: |
AW: PHPArray über Indy HTTP Post übergeben?
Ah ok, hatte mich schon gefragt warum manche Sachen via POST und manche via GET übergeben werden.
Mit Indy funktioniert ja beides sehr gut. Dankeschön. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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