4

Delphi 内から API を介してURL Shortener ( http://goo.gl/ )にアクセスしようとしています。ただし、得られる唯一の結果は次のとおりです。HTTP/1.0 400 Bad Request (reason: parseError)

これが私のコードです( IdSSLIOHandlerSocketOpenSSL1 をIOHandlerとして持つButton1Memo1、およびIdHTTP1を持つフォーム上にあります。 http://indy.fulgan.com/SSL/から必要な 32 ビット OpenSSL DLL を取得し、. 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 メッセージを見ると、ロング URL が投稿されたときにエンコーディングに何か問題があるのではないかと思われますが、何を変更すればよいかわかりません。

私はこれについてかなり長い間混​​乱してきましたが、間違いは私の目の前にあると確信しています - 私は今それを見ていないだけです. したがって、どんな助けも大歓迎です!

ありがとう!

4

2 に答える 2

4

あなたが発見したように、メソッドのTStringsオーバーロードされたバージョンはTIdHTTP.Post()使用するのに間違ったメソッドです。フォーマットされたリクエストを送信しますapplication/x-www-form-urlencodedが、これは JSON フォーマットのリクエストには適していません。代わりにメソッドのTStreamオーバーロードされたバージョンを使用する必要があります`。TIdHTTP.Post()

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; 
于 2012-08-06T16:53:07.397 に答える
2

URL Shorter API docsから:

アプリケーションが Google URL Shortener API に送信するすべてのリクエストは、Google に対してアプリケーションを識別する必要があります。アプリケーションを識別する方法は 2 つあります。OAuth 2.0 トークン (リクエストも承認します) を使用する方法と、アプリケーションの API キーを使用する方法です。

あなたの例には、OAuth または API キー認証のコードが含まれていません。

API キーで認証するには、ドキュメントは明確です。

API キーを取得したら、アプリケーションはクエリ パラメータ key=yourAPIKey をすべてのリクエスト URL に追加できます。

于 2012-08-06T12:40:40.133 に答える