早上好。
我正在开发一个小型媒体播放器,内置支持音频识别,使用 Echonest API 。我之前处理过 API,知道如何提交和解析结果,但其他 API 在其文档中提供了简单的 POST/GET
示例,因此无论语言或平台如何,它都适用于几乎所有情况。
但是,Echonest API 仅提供 CURL 示例。 CURL 是我从未处理过的东西。我正在使用 Delphi XE3
,具体来说是 Firemonkey 2
,因此没有内置的 CURL 库或组件。有一些第三方可用,但我不确定他们是否是最新的,因为他们将 Delphi 6 列为他们的开发环境,并且简短的搜索表明他们不再使用现代版本的 Delphi (这是否属实是另一回事)。
因为我想尝试并尽可能保持跨平台,以便将来有可能编译 OS X
版本,并对处理 POST
充满信心code> 和 GET
已经有了,我该如何将这个 CURL 命令“翻译”成我可以与 Indy
一起使用的命令(例如);
curl -F "api_key=FILDTEOIK2HBORODV" -F "filetype=mp3" -F "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a3e382b2921770a2b3f2e232564273a79" rel="noreferrer noopener nofollow">[email protected]</a>" "http://developer.echonest.com/api/v4/track/upload"
这直接取自他们的 API documentation ,用于将轨道上传到他们的服务。
我不确定有关 CURL 的具体细节,因此在向该服务扔随机数据之前,我觉得最好看看 SO 社区是否可以给出一个简短的解释和我可以使用的示例。无论如何,解释比示例更有值(value),但是示例对于碰巧遇到类似问题的其他人来说可能会很有用。
问候, 斯科特·普理查德。
最佳答案
-F
选项告诉curl 使用 HTTP "multipart/form-data"
Content-Type POST
提供的数据,其中在 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 的 TIdHTTP
组件的 Post()
方法通过 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;
关于delphi - CURL 作为纯 URL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179293/