使用Google HTTP Java客户端发出POST请求错误

时间:2013-02-03 09:06:45

标签: java android httpurlconnection google-http-client

我在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。

   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                  错误的请求                  

错误请求 - 标头无效

        

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

不同版本的Android使用不同版本的HttpConnection,因此表现不同。这一切都取决于你正在使用的HttpTransport。

来自docs

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