ncoberten
ncoberten

Reputation: 13

Delphi Indy http.get with curl returns: unauthorized

According to the suppliers data i should have:

I have translated this to Delphi(Indy TidHttp):

procedure TForm42.Button2Click(Sender: TObject);
var
  resp: TMemoryStream;
begin
  resp := TMemoryStream.Create;
  try
    IdHTTP1.Request.Clear;
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.BasicAuthentication := True;
    IdHTTP1.Request.CustomHeaders.FoldLines := False;
    IdHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + TokenStr;
    IdHTTP1.Get('http://10.10.1.62:8080/api/v1/doors', resp);
    resp.Position := 0;
    memCall.Lines.LoadFromStream(resp);
  finally
    resp.Free;
  end;
end;

I read a lot about it here, so finally i also added 'foldlines (Adding custom header to TIdHttp request, header value has commas) I also tried 'X-Authorization' as parameter, something i read from R. Lebeau, but the only reaction i get is an errordialog saying '401 unauthorized'.

I'm sure about the Token string (-> 'bearer ' + TokenStr) because i get an answer when putting the string in the suppliers trial.

Does someone have an idea what i'm doing wrong?

Upvotes: 1

Views: 1015

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 595507

Request.BasicAuthentication should be False not True when using custom authentications.

And you don't need to set CustomHeaders.FoldLines as TIdHTTP already disables folding by default (it wasn't disabled by default at the time the other question was posted).

Otherwise, the rest of the code looks fine.

Though, I would suggest specifying TEncoding.UTF8 on the call to LoadFromStream()), eg:

procedure TForm42.Button2Click(Sender: TObject);
var
  resp: TMemoryStream;
begin
  resp := TMemoryStream.Create;
  try
    IdHTTP1.Request.Clear;
    IdHTTP1.Request.Accept := 'application/json';
    IdHTTP1.Request.BasicAuthentication := False;
    IdHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + TokenStr;
    IdHTTP1.Get('http://10.10.1.62:8080/api/v1/doors', resp);
    resp.Position := 0;
    memCall.Lines.LoadFromStream(resp, TEncoding.UTF8);
  finally
    resp.Free;
  end;
end;

Or, using the overload of TIdHTTP.Get() that returns a string:

procedure TForm42.Button2Click(Sender: TObject);
begin
  IdHTTP1.Request.Clear;
  IdHTTP1.Request.Accept := 'application/json';
  IdHTTP1.Request.BasicAuthentication := False;
  IdHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + TokenStr;
  memCall.Text := IdHTTP1.Get('http://10.10.1.62:8080/api/v1/doors');
end;

Upvotes: 1

Related Questions