2013-01-06 47 views
2

早上好。CURL as plain URL字符串

我正在開發一款內置支持音頻識別的小型媒體播放器,使用Echonest API。我之前已經處理過API,並且知道如何提交和解析結果,但其他API在其文檔中提供了簡單的POST/GET示例,因此幾乎可以在任何情況下打開它,無論語言或平臺如何。

但是,Echonest API僅提供CURL示例。 CURL是我從未處理過的事情。我正在使用Delphi XE3Firemonkey 2,因此沒有內置CURL庫或組件。有幾個第三方可用,但我並不確定它們是最新的,因爲它們將Delphi 6列爲其開發環境,而簡短的搜索表明它們不再使用現代版本的Delphi (不管這是否屬實是另一回事)。

因爲我想嘗試,並保持內容的跨平臺,儘可能有可能在未來某一日期編譯OS X版本,並與POSTGET處理已經感到有信心,我怎麼會去「翻譯」這個CURL命令變成了我可以用於Indy(例如)的東西;

curl -F "api_key=FILDTEOIK2HBORODV" -F "filetype=mp3" -F "[email protected]" "http://developer.echonest.com/api/v4/track/upload" 

該化合物可以直接從他們的,以及用於上傳軌道他們的服務。

我不確定CURL的具體細節,所以在我將這些隨機數據扔到服務之前,我覺得最好看看SO社區是否可以給出一個簡短的解釋和我可以從中學習的例子。在任何情況下,解釋都比這個例子更有價值,但是一個例子可能適用於偶然遇到類似問題的其他人。

Regards, Scott Pritchard。

回答

3

-F選項告訴捲曲POST使用HTTP "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的TIdHTTP成分的Post()方法實現該內容類型例如:

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;