AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke PHPArray über Indy HTTP Post übergeben?

PHPArray über Indy HTTP Post übergeben?

Ein Thema von Koloss · begonnen am 27. Dez 2019 · letzter Beitrag vom 8. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2   
Koloss

Registriert seit: 21. Jul 2010
74 Beiträge
 
Delphi 2 Desktop
 
#1

PHPArray über Indy HTTP Post übergeben?

  Alt 27. Dez 2019, 22:55
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

Geändert von Koloss (27. Dez 2019 um 22:58 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#2

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 27. Dez 2019, 23:12
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Koloss

Registriert seit: 21. Jul 2010
74 Beiträge
 
Delphi 2 Desktop
 
#3

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 27. Dez 2019, 23:14
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?

Geändert von Koloss (27. Dez 2019 um 23:17 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#4

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 27. Dez 2019, 23:31
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Koloss

Registriert seit: 21. Jul 2010
74 Beiträge
 
Delphi 2 Desktop
 
#5

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 28. Dez 2019, 15:24
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.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#6

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 28. Dez 2019, 18:29
Indy escapet das wohl einfach, wenn du mehrere Parameter in einen reinpackst. Sprich & wird zu %26.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
gabneo

Registriert seit: 15. Okt 2006
Ort: Deutsche Toskana :)
93 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 3. Jan 2020, 19:40
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

Geändert von gabneo ( 3. Jan 2020 um 19:53 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#8

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 3. Jan 2020, 20:45
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
628 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 6. Jan 2020, 15:17
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.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#10

AW: PHPArray über Indy HTTP Post übergeben?

  Alt 6. Jan 2020, 18:29
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 08:03 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