2

AndroidプロジェクトでGoogleHttpJavaクライアントライブラリを使用しています。AndroidアプリのサーバーへのPOSTリクエスト用に次の基本コードがあります。

    final GenericUrl url = new GenericUrl(postURL);
    final HttpContent content = new JsonHttpContent(JSON_FACTORY, jsondata);
    // requestFactory initiated statically as class object
    HttpRequest request = requestFactory.buildPostRequest(url, content); 
    HttpResponse response = request.execute();

'RequestFactory'は、POSTメソッドを保持するクラスで静的として定義されています。

   static final HttpRequestFactory requestFactory = HTTP_TRANSPORT
        .createRequestFactory(new HttpRequestInitializer() {
            @Override
            public void initialize(HttpRequest request) {
                request.setParser(new JsonCParser(JSON_FACTORY));
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType("application/json");
                request.setHeaders(headers);
            }
        });

同じrequestfactoryが、問題を引き起こしていないGETリクエストに使用されます。POSTメソッドのみが400を引き起こします。サーバーをチェックしましたが、何も送信されていません。ログのメッセージは次のとおりです。不正なリクエスト

不正なリクエスト-無効なヘッダー


HTTPエラー400。リクエストのヘッダー名が無効です。

com.google.api.client.http.HttpResponseException:400 Bad Request Bad Request

不正なリクエスト-無効なヘッダー


HTTPエラー400。リクエストのヘッダー名が無効です。

com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1095)で

トラブルシューティングを試みました。ライブラリのNetHttpRequestクラスの接続オブジェクトにはEOFExceptionのあるHttpEngineFailureオブジェクトがあり、接続が閉じられていないと思われます。これはバグではなくベストプラクティスの問題です。

一方、Android API 2.2エミュレーターで試してみたところ、POSTリクエストは正常に機能しました。HttpUrlConnectionの問題であることを示します。

製品グループのページでこの質問をしましたが、応答がありませんでした。そのため、ここにいるJava / Androidの専門家が、これを理解するのを手伝ってくれるかもしれません。

4

2 に答える 2

0

Android のバージョンが異なれば、異なるバージョンの HttpConnection が使用されるため、動作も異なります。それはすべて、使用している HttpTransport によって異なります。

ドキュメントから:

Gingerbread 以降を対象とするアプリケーションを構築している場合は、NetHttpTransport を使用する必要があります。これは、Android SDK に組み込まれており、すべての Java SDK に含まれている HttpURLConnection に基づいています。ただし、以前の Android SDK では、HttpURLConnection の実装にバグがあり、Apache HTTP クライアントが優先されました。そのため、これらの SDK には ApacheHttpTransport を使用してください。すべての Android SDK で動作する必要がある Android アプリケーションを構築している場合は、AndroidHttp.newCompatibleTransport() を呼び出すだけで、Android SDK レベルに基づいてこれら 2 つを使用するかが決定されます。

于 2013-02-03T09:22:15.767 に答える