连接已关闭使用Indy TIdHTTP从last.fm正常请求

时间:2014-07-06 01:51:50

标签: delphi indy10 last.fm

我正在尝试使用Indy的TIdHTTP组件last.fm api。当我发送请求时,我一直收到Connection closed gracefully而没有收到任何数据。但是,当我将相同的URL从组件(直接复制到剪贴板)复制到Chrome浏览器或Firefox等Web浏览器时,它的工作完全正常。

我正在尝试实施album.search调用,并尝试GET此示例网址中的数据:

http://ws.audioscrobbler.com/2.0/?format=json&api_key=MY_API_KEY&method=album.search&album=believe&limit=30&page=1

This request is documented here

我有一个辅助函数来连接常见的URL结构:

function TLastFm.ApiUrl(const Method: String): String;
begin
  Result:= Format('http://ws.audioscrobbler.com/%s/?format=json&api_key=%s&method=%s',
    [FVersion, FKey, Method]); //FVersion = '2.0', FKey = my API key
end;

然后我就像这样打电话:

var
  S, R: String;
begin
  S:= ApiUrl('album.search')+'&album='+Album; //Album = 'believe'
  S:= S + '&limit=30&page=1';
  Clipboard.AsText:= S; //Used to paste into browser to test
  FHTTP.Request.UserAgent:= 'Mozilla/3.0 (compatible; JD Test)';
  R:= FHTTP.Get(S); //<-- Connection closed gracefully
  // ...
end;

如何使用Indy的TIdHTTP

成功拨打此电话

1 个答案:

答案 0 :(得分:2)

我刚创建了一个帐户并获得了我的API密钥。我设置了这些常量:

const
  FVersion = '2.0';
  FKey = 'MYAPIKEY';
  Album = 'believe';
function ApiUrl(const Method: String): String;

我在您手动创建它的表单上设置了IdHTTP组件。

procedure TForm1.btnGetRequestClick(Sender: TObject);
var
  S, R: String;
begin
  S := ApiUrl('album.search')+'&album='+Album; //Album = 'believe'
  S := S + '&limit=30&page=1';
  IdHTTP1.Request.UserAgent := 'Mozilla/3.0 (compatible; JD Test)';
  mem.Lines.Text := IdHTTP1.Get(S);
end;

我收到了一份充满json结果的备忘录。

编辑:

我已经做了一些后续测试,似乎如果搜索关键字中有空格,您将收到Connection Closed错误。

如果您尝试:

Album = 'believe '; // Connection closed gracefully

如果您尝试:

Album = 'believe'; // I get a json response back