Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   PHPArray über Indy HTTP Post übergeben? (https://www.delphipraxis.net/202948-phparray-ueber-indy-http-post-uebergeben.html)

Koloss 27. Dez 2019 21:55

PHPArray über Indy HTTP Post übergeben?
 
Wie übergebe ich ein doppeltes Array(PHPArray) über HTTP mit Delphi?

PHPCode:
Code:
  $variable = array(
  array(
    "Test1",
    "Test2"
  ),
  array(
    "Test3",
    "Test4"
  ),
  array(
    "Test5",
    "Test6"
  )
);
Mein Delphi Code:
Code:
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;
Verwende Delphi XE10

Redeemer 27. Dez 2019 22:12

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.

Koloss 27. Dez 2019 22:14

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?

Redeemer 27. Dez 2019 22:31

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:
variable[0][]=Test1&variable[0][]=Test2&variable[1][]=Test3&variable[1][]=Test4&variable[2][]=Test5&variable[2][]=Test6
oder
Code:
variable[0][0]=Test1&variable[0][1]=Test2&variable[1][0]=Test3&variable[1][1]=Test4&variable[2][0]=Test5&variable[2][1]=Test6
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.

Wie gesagt, hat mit Delphi absolut gar nichts zu tun.

Koloss 28. Dez 2019 14:24

AW: PHPArray über Indy HTTP Post übergeben?
 
Danke @Redeemer!

Du hast mich auf die Löasung gebracht! Eigentlich eh ganze easy.

Code:
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;
Das mit & ging nicht, denke das wird nur über querys in der url via GET funktionieren.

Redeemer 28. Dez 2019 17:29

AW: PHPArray über Indy HTTP Post übergeben?
 
Indy escapet das wohl einfach, wenn du mehrere Parameter in einen reinpackst. Sprich & wird zu %26.

gabneo 3. Jan 2020 18:40

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:
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;
Viele Grüße

Redeemer 3. Jan 2020 19:45

AW: PHPArray über Indy HTTP Post übergeben?
 
Zitat:

Zitat von gabneo (Beitrag 1454391)
Vielleicht ist JSON in diesem Fall interessant - denn sowohl Delphi als auch PHP verstehen das einwandfrei.

Hatte er ausgeschlossen, da er an das PHP-Skript nicht rankommt und das wohl kein JSON nimmt sondern die HTTP-Parameter.

Rolf Frei 6. Jan 2020 14:17

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.

Redeemer 6. Jan 2020 17:29

AW: PHPArray über Indy HTTP Post übergeben?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1454489)
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.

Ja und das ist alles geklärt, musst nur hoch scrollen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr.
Seite 1 von 2  1 2      

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