【问题标题】:POST Request Error with Google HTTP Java ClientGoogle HTTP Java 客户端的 POST 请求错误
【发布时间】:2013-01-18 05:17:48
【问题描述】:

我在我的 Android 项目中使用 Google Http Java 客户端库。我有以下基本代码,用于在 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 错误请求 错误的请求

错误请求 - 无效标头


HTTP 错误 400。请求的标头名称无效。

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

我尝试了故障排除。库的 NetHttpRequest 类中的连接对象有一个带有 EOFException 的 HttpEngineFailure 对象,这让我认为连接没有被关闭,这是一个最佳实践问题而不是错误。

另一方面,我在 Android API 2.2 模拟器上进行了尝试,并且 POST 请求在那里正常工作。表明这是一个 HttpUrlConnection 问题。

我在产品组页面上提出了这个问题,但没有得到回复,所以我想这里的一些 Java/Android 专家可能会帮助我解决这个问题。

【问题讨论】:

    标签: java android httpurlconnection google-http-client


    【解决方案1】:

    您可以执行以下操作,而不是创建 JsonHttpContent

    HttpRequest request = getHttpRequestFactory()//
            .buildPostRequest(new GenericUrl(apiUrl), ByteArrayContent.fromString("application/json", mJsonObject.toString()));
        request.setParser(new JacksonFactory().createJsonObjectParser());
    

    【讨论】:

      【解决方案2】:

      不同版本的 Android 使用不同版本的 HttpConnection,因此行为不同。这完全取决于您使用的是什么 HttpTransport。

      来自docs

      如果您正在构建针对 Gingerbread 或更高版本的应用程序,您应该使用 NetHttpTransport。这基于 Android SDK 中内置的 HttpURLConnection,在所有 Java SDK 中都可以找到。但是,在之前的 Android SDK 中,HttpURLConnection 的实现存在缺陷,因此首选 Apache HTTP 客户端。所以对于那些 SDK,请使用 ApacheHttpTransport。如果您正在构建一个需要使用所有 Android SDK 的 Android 应用程序,只需调用 AndroidHttp.newCompatibleTransport() ,它将根据 Android SDK 级别决定使用这两个。

      【讨论】:

      • 我使用AndroidHttp.newCompatibleTransport(),正如我提到的,POST 在 Android 2.2 模拟器中运行良好,这意味着正确选择了传输。
      • 啊好吧,所以真机也是Android 2.2,失败了?
      • 真实设备是 4.2 并且失败。所以导致问题的是HttpUrlConnection,而不是Apache HttpClient
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多