Ошибка 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.