Конвертировать заголовки cURL в Delphi TIdHTTP - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь обратиться к сайту OriginStamp.org, чтобы опубликовать хэш файла и получить его метку времени

curl -X GET -H "Content-Type: application/json" -H "Authorization: xxxxxxxxxxxxxxxxxxx" http://api.originstamp.org/api/yyyyyyyyyyy

Я использовал различные форматы для доступа к этому API, но это выглядело очень обнадеживающе, но безуспешно

PROCEDURE TInterNetFm.GetTIMESTAMP;
var
    i           : integer;
    response    : string;
    JSONToSend  : TStringStream;
    IndyH       : TIdHTTP;
begin
    IndyH       := TIdHTTP.Create(Application);
    JSONToSend  := TStringStream.Create('{}');
    IndyH.Request.Connection := 'Keep-Alive';
    IndyH.Request.CustomHeaders.Clear;
    IndyH.Request.CustomHeaders.Values['Content-Type'] := 'application/json';
    IndyH.Request.CustomHeaders.Values['Authorization']:='xxxxxxxxxxxxxxx';
    IndyH.Request.ContentType := 'application/json';
    response:=IdHttp1.post('http://originstamp.org/api/
        05c2422f44ddd24ba3f25848773a8fcb48435f8f966381da4732c40a7255780c', 
        JSONToSend); 
    JSONToSend.free;
    IndyH.free;
    end;

Это дает ошибку HTTP / 1.1, запрещенную 403. Я также попробовал IdHttp1.get и отладчик REST Delphi и различные атаки на REST.

Любые предложения о том, как я поступаю неправильно, будут с благодарностью.

1 Ответ

0 голосов
/ 28 июня 2018

Ошибка 403 означает, что вы, вероятно, используете неверный ключ API в заголовке Authorization. Кроме того, убедитесь, что для Request.BasicAuthentication установлено значение False, чтобы TIdHTTP не пытался отправить собственный заголовок Authorization.

При этом я вижу несколько других проблем с вашим кодом.

Вы теряете память, если TIdHTTP.Post() вызывает исключение при сбое.

Вы отправляете 2 Content-Type заголовка (один из Request.ContentType, а другой из CustomerHeaders.Values['Content-Type']). Используйте только Request.ContentType.

Вы отправляете запрос на originstamp.org, когда вместо него следует отправить на api.originstamp.org.

Вы создаете и настраиваете объект TIdHTTP с именем IndyH, но вы выполняете фактический Post(), используя вместо этого другой объект с именем IdHttp1.

Попробуйте это:

function TInterNetFm.GetTIMESTAMP(const AHash: string): string;
var
  IndyH : TIdHTTP;
  Response : string;
begin
  IndyH := TIdHTTP.Create(nil);
  try
    IndyH.Request.BasicAuthentication := False;
    IndyH.Request.CustomHeaders.Values['Authorization'] := 'YOUR_API_KEY';
    Response := IndyH.Get('http://api.originstamp.org/api/' + AHash); 
  finally
    IndyH.Free;
  end;
  // parse Response JSON as needed...
  Result := ...;
end;

function TInterNetFm.GetTIMESTAMP(const AHash, AData: string): string;
var
  IndyH : TIdHTTP;
  JSONToSend : TStringStream;
  Response : string;
begin
  IndyH := TIdHTTP.Create(nil);
  try
    IndyH.Request.BasicAuthentication := False;
    IndyH.Request.ContentType := 'application/json';
    IndyH.Request.CustomHeaders.Values['Authorization'] := 'YOUR_API_KEY';
    JSONToSend := TStringStream.Create(AData, TEncoding.UTF8);
    try
      Response := IndyH.Post('http://api.originstamp.org/api/' + AHash, JSONToSend);
    finally
      JSONToSend.Free;
    end;
  finally
    IndyH.Free;
  end;
  // parse Response JSON as needed...
  Result := ...;
end;
...