Ошибка POST-запроса с Google HTTP Java-клиентом

Я использую библиотеку Google Http Java Client в своем проекте Android. У меня есть следующий основной код для запроса POST к серверу в приложении для Android:

    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. Я проверил сервер, и на него ничего не отправляется. Сообщение в журналах следующее: Bad Request

Неверный запрос - неверный заголовок


Ошибка 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 библиотеки есть объект HttpEngineFailure с EOFException, который заставляет меня думать, что соединение не закрывается, и это скорее вопрос практики, а не ошибка.

С другой стороны, я попробовал его на эмуляторе Android API 2.2, и POST-запрос там работал нормально. Указывает, что это проблема HttpUrlConnection.

Я задал этот вопрос на странице группы продуктов, но не получил ответа, поэтому я подумал, что, возможно, некоторые эксперты по Java/Android могут помочь мне разобраться в этом.

2 ответа

Вместо создания JsonHttpContent Вы можете сделать что-то вроде этого:

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

Разные версии Android используют разные версии HttpConnection и, следовательно, ведут себя по-разному. Все зависит от того, какой HttpTransport вы используете.

Из документов:

Если вы создаете приложение, ориентированное на Gingerbread или выше, вы должны использовать NetHttpTransport. Это основано на HttpURLConnection, который встроен в Android SDK и находится во всех Java SDK. Однако в предыдущих версиях Android SDK реализация HttpURLConnection была глючной, и HTTP-клиент Apache был предпочтительным. Так что для тех SDK, пожалуйста, используйте ApacheHttpTransport. Если вы создаете приложение для Android, которое должно работать со всеми Android SDK, просто вызовите AndroidHttp.newCompatibleTransport(), и он выберет эти два для использования в зависимости от уровня Android SDK.

Другие вопросы по тегам