Hallöle,
ich muss einen REST-Service mit D7 ansprechen (es muss leider D7 sein, da komme ich nicht drum herum, habe ich mir nicht ausgesucht).
Es ist keine Authentifizierung erforderlich, und mit dem Postman bekomme ich auch ein Ergebnis, jedoch mit Delphi nicht.
Ich verwende die Indy10-Komponenten.
Folgendes ist die Prozedur, mit der ich versuche den REST-Service anzusprechen:
Delphi-Quellcode:
procedure TfrmMain.btnListClick(Sender: TObject);
var
ComObj: TWEBComm;
IdHTTP: TIdHTTP;
URL:
String;
AuthorizationString:
String;
Response: TStringStream;
begin
try
URL := '
https://<großes Geheimnis>';
AuthorizationString := '
<großes Geheimnis>';
ComObj := TWEBComm.Create;
// Interne Komponente
IdHTTP := TIdHTTP.Create;
Response := TStringStream.Create('
');
with ComObj
do begin
with IdHTTP
do begin
ConnectTimeout := 5000;
ReadTimeout := 10000;
HTTPOptions := [];
Request.CustomHeaders.Text := '
x-token: ' + AuthorizationString;
end;
Create_HTTPS(IdHTTP);
// Internes Gedönse
if sConMsg = '
OK'
then begin
try
IdHTTP.Get(
URL, Response);
// Hier kriege ich einen 401 Unauthorized
memoJson.Text := Response.DataString;
except
on e:
Exception do begin
ShowMessage('
Fehler in IdHTTP: '#13#10 + e.
Message);
end;
end;
end else begin // Fehler...
ShowMessage('
Fehler in ComObj: ' + sConMsg);
end;
end;
finally
FreeAndNil(Response);
FreeAndNil(IdHTTP);
FreeAndNil(ComObj);
end;
end;
Ok, das ist nur ein Testprogramm, daher habe ich alles in den Click-Handler gepackt, aber das ist auch nicht das Problem.
Das interne Gedönse ist nicht das Problem, da ich beim Aufruf eines anderen Endpunktes des gleichen Servers keinen 401 kriege, sondern alles glatt läuft.
Also sorry für eventuelles Chaos.
Meine Frage lässt sich glaube ich ugf. so zusammenfassen:
Ich kann den fraglichen REST-Endpunkt mit dem Postman problemlos ansprechen - mit Delphi leider nicht. Warum?
Ich kriege im Delphi einen 401, im Postman aber nicht, und eine Authentifizierung ist am Service auch nicht erforderlich.
Das x-token in den CustomHeaders ist korrekt, im Postman wie im Delphi - daran liegt es nicht. Das wird auch nicht vom Webserver ausgewertet sondern vom dem Service dahinter - der 401 kommt aber vom Webserver.
Ich habe mal die
Indy-
Unit durchdebuggt, um die RawHeaders auszulesen, und da stand nur folgendes drin:
Code:
Host:
api.glasmatic-services.net
Accept: text/
html,application/xhtml+
xml,application/
xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/3.0 (compatible;
Indy Library)
Der Postman schickt folgende Header:
Code:
Cache-Control: no-cache
Postman-Token: <calculated when request is sent>
Host: <calculated when request is sent>
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Accept-Encodig: gzip, deflate, br
Connection: keep-alive
x-token: <großes Geheimnis>
Tja
Über jeden Hinweis dankbar verbleibt
Caps