2

これは、URL 短縮サービスに関する別の質問に関連しています。URL Shorter のコードは、スタンドアロンの Java と Android の両方で正常に動作します。ただし、このコードを再利用してカスタム Google App Engine アプリケーションと通信する場合、コードはスタンドアロン Java では問題なく動作しますが、Android から使用すると空の self.request.body が生成されます。なんで?

この動作を再現するには、以下のコードを Android で実行します。1 回は Google 短縮 URL: https://www.googleapis.com/urlshortener/v1/urlを使用し、もう 1 回は Web サーバーへのカスタム URL を使用します。スタンドアロンの Java で同じコードを実行すると、どちらの場合も (予想どおり) まったく同じ要求が生成されます。Android では、カスタム URL の場合、コンテンツの本文が空であり、コンテンツの長さが設定されていません。ジャクソン 1.7.1 で google-api-java-client 1.2.2-alpha を実行しています。

コード スニペット:

    HttpTransport transport = GoogleTransport.create();
    HttpRequest request = transport.buildPostRequest();

    // Change this URL below from Google Shortener URL, to a custom URL,
    // and the code on Android produces an empty body and Content-Length is not set
    request.setUrl("GoogleAppEngine url goes here");

    JsonCContent content = new JsonCContent();
    GenericData data = new GenericData();
    data.put("id", "whatever");
    content.data = data;
    request.content = content;
    HttpResponse response = request.execute();
4

1 に答える 1

2

デバッグを行ったところ、次のようになりました。

  • デフォルトでは、Android の実装は Apache HTTP クライアントを選択して低レベルのトランスポートを行います。そこにあるコードは最小限であり、リクエストの Content-Type と Content-Length が適切に設定されていないように見えます。リクエストは送信されますが、一部の (ほとんどの) うるさい Web サーバーは本文をスキップします。Google Web サーバーは問題なく処理しているようです。したがって、Google サーバーでは問題なく動作するようですが、他の Web サーバーではうまく動作しません (これは少し奇妙ですが、これは私の問題の範囲を超えています)。

  • デフォルトでは、Java では、java.net.HttpURLConnection が低レベルの http トランスポートに選択されます。この実装はより冗長で、すべての必須フィールドを適切に設定します。Content-Length があり、Content-Type と他のすべてのフィールドもあります。JSON コンテンツがシリアル化され、すべての Web サーバーが満足します。私のカスタムGAEアプリを含みます。

そのため、Android では、次の回避策で問題を解決できます。

次の呼び出しを行います。

HttpTransport.setLowLevelHttpTransport(新しい com.google.api.client.javanet.NetHttpTransport());

する前にrequest.execute()

このように、Android では、実際に機能するトランスポートを使用します (よりきちんとした要求が形成されます)。

ps。人生でよくあることですが、私は怠惰になり、誰かが私のためにそれを解決してくれることを期待して質問をしました. 自分でデバッグして解決することになり、さらにすべてを書かなければなりませんでした。余分な作業ですが、他のすべての人にとってはメリットがあると思います。他の人が役に立つことを願っています。

ps.2。google api Java client は今ではうまく機能しています ;) 良い仕事をしてくれた作者に感謝します。

于 2011-01-30T18:33:06.497 に答える