将cURL标头转换为Delphi TIdHTTP

时间:2018-06-28 15:09:23

标签: delphi curl idhttp

我正在尝试访问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和Delphi REST调试器以及REST上的各种附件。

任何有关我如何解决此问题的建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

403错误表示您可能在Authorization标头中使用了无效的API密钥。另外,请确保将Request.BasicAuthentication设置为False,以使TIdHTTP不会尝试发送自己的Authorization标头。

话说回来,我发现您的代码还有其他几个问题。

如果TIdHTTP.Post()在失败时引发异常,则您正在泄漏内存。

您正在发送2个Content-Type标头(一个来自Request.ContentType,另一个来自CustomerHeaders.Values['Content-Type'])。仅使用Request.ContentType

当您将请求发送到originstamp.org时,您正在将请求发送到api.originstamp.org

您正在创建和配置名为TIdHTTP的{​​{1}}对象,但实际上是使用另一个名为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;