AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Daten abholen von einem CakePHP Server

Daten abholen von einem CakePHP Server

Ein Thema von MartinK · begonnen am 4. Okt 2014 · letzter Beitrag vom 8. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2   
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: Daten abholen von einem CakePHP Server

  Alt 7. Okt 2014, 13:28
Danke nochmal, Michael!

-> iDHTTP.Request.Authentication := TIdBasicAuthentication.Create;
ist bei CakePHP bei mir notwendig, ansonsten gibt's eine EAccessViolation (000000000)

hier nochmal die finale version als "function"

LG Martin

Delphi-Quellcode:
Function Ask4aCloudResponse(aUsername, aPassword, aServerURL, aBody : String ):String;
Var
  iDHTTP: TIdHttp;
begin
  IdHttp := TIdHttp.Create;

  try
    iDHTTP.HandleRedirects := True;
    iDHTTP.Request.BasicAuthentication := True;
    iDHTTP.Request.Authentication := TIdBasicAuthentication.Create;
    iDHTTP.Request.Authentication.Username := aUsername;
    iDHTTP.Request.Authentication.Password := aPassword;
    IdHTTP.Request.ContentType := 'application/json';
    Result := IdHttp.Get(aServerURL + aBody);
  finally
    IdHTTP.Free;
  end;
end;
Martin Kuhn

Geändert von MartinK ( 7. Okt 2014 um 22:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Daten abholen von einem CakePHP Server

  Alt 7. Okt 2014, 21:51
try bitte nach dem Create !
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Daten abholen von einem CakePHP Server

  Alt 7. Okt 2014, 22:37
OK, "again what learnt"
-> Geändert!
Martin Kuhn
  Mit Zitat antworten Zitat
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 11:56
Damit es nicht zu leicht wird, hier die nächste Challenge zum selben Thema
Neben den einfach Dingen die per Get-Befehl nun wunderbar laufen, muss ich für andere API Befehle weitere Daten mitschicken.
Ich denke mal ich benötige dazu ein http.post


hier ein Auszug aus der API:

==================================
Login ausführen durch:
http://aServerName.de/users/login.json

Hierzu muss ein HTTPBody Field mitgeschickt werden (Anmerkung: was auch immer das genau ist...)

HTTPBody
{
UID = "04DAB959-9EF6-442C-8A19-D463C57E61D5";
activeversion = 312;
locale = de;
password = aPassword;
premium = 0;
username = "its.me@mail.com";
}


Wie macht man denn nun so etwas?
Meine erste Idee war daraufhin so etwas.


Delphi-Quellcode:
Var
  iDHTTP: TIdHttp;
  ResponseStr:String;
  Params: TStringStream;
begin

  IdHttp := TIdHttp.Create;
  Params := TStringStream.create('');
  try
    Params.WriteString(URLEncode('UID='           + '04DAB959-9EF6-442C-8A19-D463C57E61D5' + '&'));
    Params.WriteString(URLEncode('activeversion=' + '312'                                  + '&'));
    Params.WriteString(URLEncode('locale='        + 'de'                                   + '&'));
    Params.WriteString(URLEncode('password='      + EaCloudPassword.Text + '&'));
    Params.WriteString(URLEncode('premium='       + '1'                                    + '&'));
    Params.WriteString(URLEncode('username='      + EaCloudUsername.Text));

    iDHTTP.HandleRedirects := True;
    iDHTTP.Request.BasicAuthentication := True;
    iDHTTP.Request.Authentication := TIdBasicAuthentication.Create;
    iDHTTP.Request.Authentication.Username := EaCloudUsername.Text;
    iDHTTP.Request.Authentication.Password := EaCloudPassword.Text;
    IdHTTP.Request.ContentType := 'application/json';

    try
      IdHTTP.Response.KeepAlive := False;
      ResponseStr := IdHTTP.Post('http://aServerName.de/users/login.json', Params);
    except
      on E: Exception do
          showmessage('Error encountered during POST: ' + E.Message);
    end;

  finally
    IdHTTP.Free;
  end;

Der Code wird zwar ohne Fehler ausgeführt, die von CAKE-Server zurüchgelieferte Respons (ellenlang....) zeigt allerdings einen fehler

'<pre class="cake-error"><a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b147-trace'').style.display = (document.getElementById(''cakeErr54366d3e5b147-trace'').style.display == ''none'' ? '''' : ''none'');"><b>Warning</b> (4096)</a>: Argument 1 passed to Hash::get() must be an array, null given, called in /var/www/vhosts/acalc.de/httpdocs/cakephp-2.4.3/lib/Cake/Network/CakeRequest.php on line 853 and defined [<b>CORE/Cake/Utility/Hash.php</b>, line <b>43</b>]<div id="cakeErr54366d3e5b147-trace" class="cake-stack-trace" style="display: none;"><a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b147-code'').style.display = (document.getElementById(''cakeErr54366d3e5b147-code'').style.display == ''none'' ? '''' : ''none'')">Code</a> <a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b147-context'').style.display = (document.getElementById(''cakeErr54366d3e5b147-context'').style.display == ''none'' ? '''' : ''none'')">Context</a><pre id="cakeErr54366d3e5b147-code" class="cake-code-dump" style="display: none;"><code><span style="color: #000000"><span style="color: #0000BB">&nbsp;</span><span style="color: #007700">*&nbsp;@</span><span style="color: #0000BB">link&nbsp;http</span><span style="color: #007700">:</span><span style="color: #FF8000">//book.cakephp.org/2.0/en/core-utility-libraries/hash.html#Hash::get</span></span></code>'#$A'<code><span style="color: #000000"><span style="color: #0000BB">&nbsp;</span><span style="color: #007700">*/</span></span></code>'#$A'<span class="code-highlight"><code><span style="color: #000000"><span style="color: #0000BB">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;static&nbsp;function&nbsp;</span><span style="color: #0000BB">get</span><span style="color: #007700">(array&nbsp;</span><span style="color: #0000BB">$data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$path</span><span style="color: #007700">)&nbsp;{</span></span></code></span></pre><pre class="stack-trace">Hash::get() - CORE/Cake/Utility/Hash.php, line 43'#$A'CakeRequest::data() - CORE/Cake/Network/CakeRequest.php, line 853'#$A'UsersController::login() - APP/Controller/UsersController.php, line 52'#$A'ReflectionMethod::invokeArgs() - [internal], line ??'#$A'Controller::invokeAction() - CORE/Cake/Controller/Controller.php, line 490'#$A'Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 185'#$A'Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 160'#$A'[main] - APP/webroot/index.php, line 108</pre></div></pre><pre class="cake-error"><a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b9d7-trace'').style.display = (document.getElementById(''cakeErr54366d3e5b9d7-trace'').style.display == ''none'' ? '''' : ''none'');"><b>Warning</b> (4096)</a>: Argument 1 passed to Hash::get() must be an array, null given, called in /var/www/vhosts/acalc.de/httpdocs/cakephp-2.4.3/lib/Cake/Network/CakeRequest.php on line 853 and defined [<b>CORE/Cake/Utility/Hash.php</b>, line <b>43</b>]<div id="cakeErr54366d3e5b9d7-trace" class="cake-stack-trace" style="display: none;"><a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b9d7-code'').style.display = (document.getElementById(''cakeErr54366d3e5b9d7-code'').style.display == ''none'' ? '''' : ''none'')">Code</a> <a href="javascript:void(0);" onclick="document.getElementById(''cakeErr54366d3e 5b9d7-context'').style.display = (document.getElementById(''cakeErr54366d3e5b9d7-context'').style.display == ''none'' ? '''' : ''none'')">Context</a><pre id="cakeErr54366d3e5b9d7-code" class="cake-code-dump" style="display: none;"><code><span style="color: #000000"><span style="color: #0000BB">&nbsp;</span><span style="color: #007700">*&nbsp;@</span><span style="color: #0000BB">link&nbsp;http</span><span style="color: #007700">:</span><span style="color: #FF8000">//book.cakephp.org/2.0/en/core-utility-libraries/hash.html#Hash::get</span></span></code>'#$A'<code><span style="color: #0...

was ist denn das jetzt schon wieder ??

LG M
Martin Kuhn
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 12:08
Verpacke mal die Stringwerte in ""

Lass Dir mal den Header in php anzeigen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#6

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 13:10
Hierzu muss ein HTTPBody Field mitgeschickt werden (Anmerkung: was auch immer das genau ist...)
Das, was ich in #2 als POST-Daten betitelt habe.

Wenn ich das richtig sehe, hast du den richtigen Ort für diese im Code bereits gefunden.

Vermutlich stimmt noch etwas mit der Encodierung nicht. Wo hast du deine Dokumentation mit dem "HTTPBody {" (insb. wegen der geschweiften Klammer auf) her? Kannst du uns eventuell eine genauere Dokumentation verlinken oder bereitstellen?

Ich bisher nicht ganz sagen, in welchem Format die Eingabedaten erwartet werden.

Übrigens: Sei gewarnt, dass du beim Benutzernamen und Passwort ein Problem bekommst, wenn Zeichen wie "&" darin vorkommen. Die Daten müssen erst Codiert werden. Eigentlich aber ist es sinnvoller die Kodierung dieser Daten nicht selbst zu machen. Indy bietet sicherlich eine Möglichkeit dir das abzunehmen.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 13:15

Login ausführen durch:
http://aServerName.de/users/login.json

Hierzu muss ein HTTPBody Field mitgeschickt werden (Anmerkung: was auch immer das genau ist...)

HTTPBody
{
UID = "04DAB959-9EF6-442C-8A19-D463C57E61D5";
activeversion = 312;
locale = de;
password = aPassword;
premium = 0;
username = "its.me@mail.com";
}
Das ist kein gültiges JSON. Steht das genau so in der Dokumentation?

Wenn es JSON sein soll, das im Body gesendet wird, dann empfehle ich einen JSON Parser wie SuperObject zu verwenden.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#8

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 13:17
Das ist kein gültiges JSON. Steht das genau so in der Dokumentation?
Was er schickt ist auch kein JSON.

Daher die Frage, was er überhaupt senden soll. Fest steht nur, dass er vermutlich JSON zurückbekommt.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 13:20

Delphi-Quellcode:
  Params := TStringStream.create('');
  try
    Params.WriteString(URLEncode('UID='           + '04DAB959-9EF6-442C-8A19-D463C57E61D5' + '&'));
Das Ergebnis in Params passt nicht zum dargestellten Format (& statt .

Tipp: für das Debuggen kann man ganz einfach einen Interceptor in Indy zuweisen, der dann die Kommunikation protokolliert. Wenn das zu einfach ist ( ) kann man alternativ Fiddler2 als Proxy zum Loggen einsetzen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

AW: Daten abholen von einem CakePHP Server

  Alt 9. Okt 2014, 18:04
Ich würde mal sagen die Doku der API die ich erhalten habe ist noch "sehr basic". Die muss und werde ich im Anschluss selbst überarbeiten.

Die Idee mit dem JSON Superobjekt war mal wieder der Bringer überhaupt.
Das Teil ist ja echt Weltklasse sobald man es mal halbwegs verstanden hat.

-> Der Übergabe HTTPBody ist JSON
-> und ich bekomme inzw. auch einen passenden JSON String als response zurück, welchen ich nun nur noch auswerten muss

Bin absolut begeistert wie Klasse das funktioniert, muss jetzt aber erstmal etwas essen bevor ich das fertig mache.
Ich poste dann vermutlich wieder meinen Code, damit andere auch etwas davon haben

VIELEN DANK euch allen erneut
LG MARTIN
Martin Kuhn
  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 22:09 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