delphi - CURL 作为纯 URL 字符串

标签 delphi curl delphi-xe3 firemonkey-fm2

早上好。

我正在开发一个小型媒体播放器,内置支持音频识别,使用 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/

相关文章:

php - 我们如何在 Guzzle 中指定 TLS/SSL 选项?

http - 为什么当响应超过 8kb 时 golang http 服务器失败并显示 "broken pipe"?

sqlite - 如何在 Delphi 将整数值插入 SQLite 表

delphi - FireDAC - 在宏扩展后显示 SQL

arrays - 为什么我不能返回任意字符串数组?

c# - 如何使用非托管导出 (Robert Giesecke) 将结构数组从 .NET 传递到 Delphi?

delphi - 如何编译DUnit2

delphi - 使用 Chromium Embedded 时如何修复此内存泄漏?

curl - 使用curlpp编译时出错

delphi - 如何用科学记数法格式化数字