CURL作为普通URL字符串

时间:2013-01-06 04:28:41

标签: delphi curl delphi-xe3 firemonkey-fm2

早上好。

我正在使用Echonest API开发一个内置支持音频识别的小型媒体播放器。我以前处理过API并且知道如何提交和解析结果,但是其他API在他们的文档中提供了简单的POST/GET示例,因此无论语言或平台如何,都可以将其打开。

然而,Echonest API仅提供CURL示例。 CURL是我从未处理过的事情。我在Delphi XE3Firemonkey 2工作是具体的,因此没有内置的CURL库或组件。有一些第三方可用,但我不相信他们是最新的,因为他们将Delphi 6列为他们的开发环境,并且简短的搜索表明他们不再使用现代版本的Delphi (这是否真实是一个不同的故事)。

因为我想尽可能地保持跨平台的东西,以便在将来的某个日期编译OS X版本,并且对处理POST和{{1}有信心我已经如何将这个CURL命令“转换”为GET可以使用的东西(例如);

Indy

这是直接从他们的API documentation获取的,用于将曲目上传到他们的服务。

我不确定有关CURL的细节,所以在我将服务中的随机数据投入之前,我觉得最好看看SO社区是否可以提供一个简短的解释和我可以使用的例子。在任何情况下,这个解释都比这个例子更有价值,但是一个例子可能适用于碰巧遇到类似问题的其他人。

此致 Scott Pritchard。

1 个答案:

答案 0 :(得分:3)

-F选项使用HTTP POST Content-Type告诉curl "multipart/form-data"提供的数据,在HTTP层看起来像这样:

POST /api/v4/track/upload HTTP/1.1
Host: developer.echonest.com
Content-Type: multipart/form-data; boundary="boundaryvalue"

--boundaryvalue
Content-Disposition: form-data; name="api_key"

FILDTEOIK2HBORODV
--boundaryvalue
Content-Disposition: form-data; name="filetype"

mp3
--boundaryvalue
Content-Disposition: form-data; name="track"; filename="audio.mp3"
Content-Type: audio/x-mpg

<binary audio data here>
--boundaryvalue--

Indy的Post()组件的TIdHTTP方法通过TIdMultipartFormDataStream实用程序类实现Content-Type,例如:

uses
  ..., IdHTTP, IdMultipartFormData;

var
  Data: TIdMultipartFormDataStream;
begin
  Data := TIdMultipartFormDataStream.Create;
  try
    Data.AddFormField('api_key', 'FILDTEOIK2HBORODV');
    Data.AddFormField('filetype', 'mp3');
    Data.AddFile('track', 'C:\path to\audio.mp3');
    IdHTTP1.Post('http://developer.echonest.com/api/v4/track/upload', Data);
  finally
    Data.Free;
  end;
end;