Google HTTP Java 客户端的 POST 请求错误



我在我的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);
            }
        });

相同的请求工厂用于未引起任何问题的 GET 请求。只有 POST 方法会导致 400。我检查了服务器,但没有向它发送任何内容。日志中的消息如下: 错误请求

错误请求 - 标头无效


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

com.google.api.client.http.HttpResponseException: 400 错误请求 错误请求

错误请求 - 标头无效


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

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

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

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

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

与其创建JsonHttpContent,不如执行以下操作:

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

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

从文档:

如果要构建面向 Gingerbread 或更高版本的应用程序,则应使用 NetHttpTransport。这是基于内置在Android SDK中的HttpURLConnection,可以在所有Java SDK中找到。然而,在以前的Android SDK中,HttpURLConnection的实现是有缺陷的,Apache HTTP Client是首选。因此,对于这些SDK,请使用ApacheHttpTransport。如果你正在构建一个需要与所有Android SDK一起使用的Android应用程序,只需调用AndroidHttp.newCompatibleTransport(),它将根据Android SDK级别决定使用这两个。

相关内容

  • 没有找到相关文章

最新更新