CURL как простая строка URL

Доброе утро.

Я занимаюсь разработкой небольшого медиа-плеера со встроенной поддержкой распознавания звука с использованием Echonest API. Я имел дело с API раньше и знаю, как отправлять и анализировать результаты, но другие API предоставили простой POST/GET примеры в их документации, таким образом, открывая это практически для любой ситуации, независимо от языка или платформы.

Однако Echonest API предоставляет только примеры CURL. CURL - это то, с чем я никогда не сталкивался. Я работаю в Delphi XE3, или же Firemonkey 2 чтобы быть конкретным, и, следовательно, нет встроенной библиотеки CURL или компонентов. Доступно несколько сторонних, но я не уверен, что они в курсе, поскольку они указывают Delphi 6 как среду разработки, а краткие поиски показывают, что они больше не работают с современными версиями Delphi. (правда это или нет - другая история).

Поскольку я хочу попытаться сохранить кросс-платформенность, чтобы потенциально скомпилировать OS X версия в будущем, и чувствовать себя уверенно в отношениях с POST а также GET уже, как бы я "перевести" эту команду 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 дать краткое объяснение и пример, с которым я могу работать. В любом случае объяснение гораздо более ценно, чем пример, но пример может быть полезен для всех, кто сталкивается с подобной проблемой.

С уважением, Скотт Притчард.

1 ответ

Решение

-F опция говорит завиток POST предоставленные данные с использованием HTTP "multipart/form-data" Content-Type, который выглядит следующим образом на уровне 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() метод Инди 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;
Другие вопросы по тегам