AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Zugriff auf Shopware REST API mit idHTTP
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Shopware REST API mit idHTTP

Ein Thema von mocition · begonnen am 20. Nov 2012 · letzter Beitrag vom 31. Mär 2013
Antwort Antwort
mocition

Registriert seit: 20. Nov 2012
16 Beiträge
 
#1

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 21. Nov 2012, 17:54
ach ich Depp!!
Beim Zugriff über den Browser http://localhost/api meldet der Server auch eine "404 Not Found" zurück.
Wenn ich allerdings http://localhost/api/articles mit dem Server oder mit Delphi zugreife, dann bekomm ich "200 OK"

!!Danke für die Hilfe!!
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 30. Mär 2013, 20:24
Mich würde interessieren, ob du eine zweite Abfrage ausführen kannst. Bei mir funktioniert zwar der erste Aufruf wunderbar, beim zweiten Aufruf mit der gleichen Abfrage ergibt dann einen Fehler 400 Bad Request.
Eine Untersuchung mit Fiddler zeigte dann, dass nur bei der ersten Abfrage der Digest mitgesendet wird. Beim zweiten Aufruf steht nur "Digest" drin und nichts weiter.
Code:
procedure TForm1.Button2Click(Sender: TObject);
var s: String;
IdHTTP2: TIdHTTP;
begin
  try
    IdHTTP2 := TIdHTTP.Create();

    IdHTTP2.OnAuthorization := Auth;

    IdHTTP2.HTTPOptions := [hoInProcessAuth];
    IdHTTP2.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0';
    IdHTTP2.Request.Host := '192.168.1.1';
    IdHTTP2.Request.URL := 'http://192.168.1.1/shopware/api/orders/';
    IdHTTP2.Request.AcceptLanguage := 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';

    // Erster Aufruf
    s := IdHTTP2.get(IdHTTP2.Request.URL);
    Memo1.Lines.Add(s);

    // Zweiter Aufruf: Fehler 400
    s := IdHTTP2.get(IdHTTP2.Request.URL);
    Memo1.Lines.Add(s);
  finally
    IdHTTP2.Free;
  end;
end;
Die Auth-Routine sieht dann so aus:
Code:
procedure TForm1.Auth(Sender: TObject; Authentication: TIdAuthentication;
  var Handled: Boolean);
begin
  if not (sender is TIdHTTP) then exit;
  Authentication.Username:='admin';
  Authentication.Password:='apipasswort';
  if Authentication is TIdDigestAuthentication then begin
    with Authentication as TIdDigestAuthentication do begin
      Uri:=(Sender as TIdHTTP).Request.URL;
      Method:=(Sender as TIdHTTP).Request.Method;
    end;
  end;
  Handled:=True;
end;
Beim ersten Aufruf zeigt er im Fiddler die Authorizierung so an:
Code:
Authorization: Digest username="admin", realm="Shopware4 REST-API", nonce="174d221165c197bfb342ce5a4feb8504", algorithm="MD5", uri="http://192.168.1.1/shopware/api/orders/", qop="auth", nc=00000001, cnonce="2aff1b184c89e001e311096be805adae", response="73a424ad6d733aa915bb445850e7d448", opaque="d75db7b160fe72d1346d2bd1f67bfd10"
Beim zweiten Aufruf fehlt das alles
Code:
Authorization: Digest
Normal kann das so nicht richtig sein, da ein Browser sich auch nur einmal authorisieren muss.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 30. Mär 2013, 21:46
Die kompletten HTTP vom Server wären interessant.

Mit IdHTTP2.Request.URL als URL zu arbeiten ist auch nicht ganz sinnvoll, während der Authentisierung wird dieser Wert überschrieben IdHTTP.DoRequest():
Delphi-Quellcode:
        wnAuthRequest:
          begin
            Request.URL := AURL;
          end;
Vielleicht hilft es schon IdHTTP2.Request.Connection := 'Keep-Alive'; zu setzten.

Also du könntest es mal versuchen zwischen den beiden Requests IdHTTP2.Request.Authentication.Next aufrufen.

Innerhalb der unit IdAuthenticationDigest gibt es die Authentication Funktion. Die ist ganz interessant.

Intern wird über ein Zähler FCurrentStep der aktuelle Schritt gesetzt. Wenn du also deinen ersten Request absetzt, dann wird von der TIdHTTP Komponente über die TIdDigestAuthentication Komponente mittels der Funktion Authentication der Authentication Header erzeugt und FCurrentStep auf 0 gesetzt.

Beim nächsten Request ist dann FCurrentStep noch bei 0 und es wird als Authentication Header nur "Digest" zurückgegeben.

Am besten du gehst mit dem Debugger mal ganz langsam durch den Code.

EDIT:
Der nächste Request muss so aussehen, dass du [...] nc=00000002 [...] überträgst: http://en.wikipedia.org/wiki/Digest_...th_explanation ::
Zitat:
For subsequent requests, the hexadecimal request counter (nc) must be greater than the last value it used
Sebastian

Geändert von geskill (30. Mär 2013 um 21:48 Uhr)
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 31. Mär 2013, 09:30
Also du könntest es mal versuchen zwischen den beiden Requests IdHTTP2.Request.Authentication.Next aufrufen.
Genau das wars wohl! Danke Danke Danke! Geht nun so oft hintereinander wie ich will. Den Befehl Next konnte ich auf keiner Internetseite finden.

Ein IdHTTP2.Request.Connection := 'Keep-Alive' zu setzen hat nichts bewirkt, somit kann ich es ersteinmal weglassen. Gruß Ronny.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 31. Mär 2013, 11:09
Eigentlich muss das Indy intern aufrufen, also sich selbstständig darum kümmern.

Ich werde das mal versuchen lokal zu reproduzieren und dann im Falle eines Fehlers (wovon ich ausgehe) melden.
Sebastian
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 31. Mär 2013, 11:14
Falls es hilft, ich arbeite mit Delphi 2007 und benutzte erst die enthaltenen Indys. Auf Grund der Fehler habe ich den Nightly Build geladen und diese ins Delphi integriert. Zwar haben die viele neue Funktionen und Parameter, aber der Fehler mit der Digest Authentifizierung war leider der gleiche.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Zugriff auf Shopware REST API mit idHTTP

  Alt 31. Mär 2013, 21:33
Mit den aktuellen Indys klappt es.

Im März 2011 wurde die Digest Implementierung grundlegend überarbeitet.

Für die Installation, die nicht ganz so einfach ist, wenn man es das erste mal macht, gibt es ein Tutorial von einem Nutzer hier aus dem Forum http://www.herrotto.de/delphiindy/

Ich empfehle den aktuellen Stand des trunks zu benutzen, da sich inzwischen unglaublich viel im Vergleich zu D2007 geändert hat!
Angehängte Dateien
Dateityp: zip digesttest.zip (5,1 KB, 71x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


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:49 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