2

早上好。

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

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

因为我想尝试尽可能地保持跨平台的东西,以便OS X在将来编译一个版本,并且对处理POSTGET已经有信心,我将如何着手将这个 CURL 命令“翻译”成我可以的东西与Indy(例如)一起使用;

curl -F "api_key=FILDTEOIK2HBORODV" -F "filetype=mp3" -F "track=@audio.mp3" "http://developer.echonest.com/api/v4/track/upload"

这直接取自他们的API 文档,用于将曲目上传到他们的服务。

我不确定有关 CURL 的具体细节,因此在我向服务中抛出随机数据之前,我觉得最好看看 SO 社区是否可以给出我可以使用的简要解释和示例。在任何情况下,解释都比示例更有价值,但是对于碰巧遇到类似问题的其他人来说,示例可能会很好。

问候,斯科特·普里查德。

4

1 回答 1

3

-F选项使用 HTTP Content-Type 告诉 curlPOST提供的数据"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--

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

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;
于 2013-01-06T05:59:09.303 回答