2

これは別のquestion about URL shortenerに関連しています。 URL短縮ツールのコードは、スタンドアロンJavaとAndroidの両方でうまく動作します。しかし、このコードを再利用してカスタムGoogle App Engineアプリケーションと通信すると、コードはスタンドアロンJavaで完全に正常に動作しますが、Androidから使用すると空のself.request.bodyが生成されます。 なぜですか?一度、Googleの短縮URLを使用して、Android上で、以下のコードを実行し、この現象を再現するにはgoogle-api-java-client AndroidのJSONパーサーは空のself.request.bodyを生成します。

https://www.googleapis.com/urlshortener/v1/url、一度WebサーバへのカスタムURLを持ちます。 スタンドアロンJavaの同じコードは、どちらの場合もまったく同じ要求を期待通りに生成します。 Androidでは、カスタムURLの場合、コンテンツ本文は空で、コンテンツ長は設定されていません。 私はgoogle-api-java-client 1.2.2-alphaを、jackson 1.7.1で実行しています。

コードスニペット:

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(); 

答えて

2

私はいくつかのデバッグを行ってきたが、これは結局のところ何です:

  • デフォルトでは、Android上で実装が低いを行うためのApache HTTPクライアントを選びますレベル輸送。コードには最小限のものがあり、要求のContent-TypeとContent-Lengthが正しく設定されていないかのように見えます。リクエストは消えますが、一部の(ほとんどの)厄介なWebサーバーは本文をスキップします。 GoogleのWebサーバーはこれを処理しているようです。だから、それは他のWebサーバー(これはちょっと変わったですが、これは私の問題点を超えています)ではなく、Googleサーバーでうまくいくようです。

  • デフォルトでは、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。人生ではしばしばそうであるように、私は怠け者になって、誰かが私のためにそれを解決することを望んで、質問をしました。デバッグを終わらせ、それを自分で解決すれば、PLUSはそれをすべて書かなければなりませんでした。余分な仕事 - だが、他の人にとってはメリットがあると思う。他の人がそれが役に立つと願っています。

ps.2。 google api java client rocks now;)良い仕事をしてくれた著者に感謝します。

+1

これを調査し、分析と慎重なフィードバックを書き留めていただきありがとうございます。私はまだApache HTTPクライアントのHTTP転送の実装で何が問題なのかを最終的に判断しようとしています。ところで、バージョン1では。3の開発では、使用されるHTTPトランスポートの実装がもう隠されることはありません。これは、デバッグ作業を簡単にしてくれたと思います。 –

関連する問題