德尔福:使用谷歌URL缩短与IdHTTP - 400错误的请求(Delphi: Using Go

2019-07-30 19:43发布

我试图访问的URL缩短( http://goo.gl/通过其API从内部德尔福)。 然而,唯一的结果我得到的是:HTTP / 1.0 400错误的请求(原因:parseError)

这里是我的代码(有Button1的 ,Memo1IdHTTP1IdSSLIOHandlerSocketOpenSSL1作为其IOHandler一个形式。我得到了必要的32位的DLL的OpenSSL http://indy.fulgan.com/SSL/并把它们放到。 exe文件的目录):

procedure TFrmMain.Button1Click(Sender: TObject);
    var html, actionurl: String;
    makeshort: TStringList;
begin
try
 makeshort := TStringList.Create;

 actionurl := 'https://www.googleapis.com/urlshortener/v1/url';
 makeshort.Add('{"longUrl": "http://slashdot.org/stories"}');

 IdHttp1.Request.ContentType := 'application/json';
 //IdHTTP1.Request.ContentEncoding := 'UTF-8'; //Using this gives error 415

 html := IdHTTP1.Post(actionurl, makeshort);
 memo1.lines.add(idHTTP1.response.ResponseText);

     except on e: EIdHTTPProtocolException do
        begin
            memo1.lines.add(idHTTP1.response.ResponseText);
            memo1.lines.add(e.ErrorMessage);
        end;
    end;

 memo1.Lines.add(html);
 makeshort.Free;
end;

更新:我已经离开了在这个例子中我的API密钥(通常应该没有一个试了几次不错的选择),但如果你想用你自己去尝试,你可以用替代actionurl'https://www.googleapis.com/urlshortener/v1/url?key=<yourapikey>';

该ParseError消息使我相信,当它被公布,但我不知道是什么改变有可能是有点问题longurl的编码。

我一直在模糊化了这个相当长的一段时间,我在我眼前敢肯定,错误是 - 我只是没有看到它现在。 因此,任何的帮助感激!

谢谢!

Answer 1:

当你发现,该TStrings超载的版本TIdHTTP.Post()方法是用错误的方法。 它发送一个application/x-www-form-urlencoded格式的请求,这是不适合于JSON格式请求。 您必须使用TStream中的重载版本TIdHTTP.Post()方法instead`,如:

procedure TFrmMain.Button1Click(Sender: TObject); 
var
  html, actionurl: String; 
  makeshort: TMemoryStream; 
begin 
  try
    makeshort := TMemoryStream.Create; 
    try 
      actionurl := 'https://www.googleapis.com/urlshortener/v1/url'; 
      WriteStringToStream(makeshort, '{"longUrl": "http://slashdot.org/stories"}', IndyUTF8Encoding); 
      makeshort.Position := 0;

      IdHTTP1.Request.ContentType := 'application/json'; 
      IdHTTP1.Request.Charset := 'utf-8';

      html := IdHTTP1.Post(actionurl, makeshort); 
    finally
      makeshort.Free; 
    end;

    Memo1.Lines.Add(IdHTTP1.Response.ResponseText); 
    Memo1.Lines.Add(html); 
  except
    on e: Exception do 
    begin 
      Memo1.Lines.Add(e.Message); 
      if e is EIdHTTPProtocolException then
        Memo1.lines.Add(EIdHTTPProtocolException(e).ErrorMessage); 
    end; 
  end; 
end; 


Answer 2:

从URL缩短API文档 :

每个请求您的应用程序发送给谷歌URL缩短API需要确定您的应用程序谷歌。 有两种方法,以确定您的应用程序:使用OAuth 2.0令牌(也授权请求)和/或使用应用程序的API密钥。

您的例子不包含的OAuth或API密钥验证码。

要使用API​​密钥验证,该文档是明确的:

之后,你有一个API密钥,应用程序可以追加查询参数键= yourAPIKey所有请求的URL。



文章来源: Delphi: Using Google URL Shortener with IdHTTP - 400 Bad Request