Анализатор JSON google-api-java-client в Android создает пустой файл self.request.body в GAE - PullRequest
2 голосов
/ 28 января 2011

Это связано с другим вопросом о сокращении URL .Код для сокращения URL работает нормально, как на автономной Java, так и на Android.Однако при повторном использовании этого кода для связи с пользовательским приложением Google App Engine код отлично работает на автономной Java, но при использовании с Android выдает пустой self.request.body. Почему?

Чтобы воспроизвести это поведение, запустите приведенный ниже код на Android, один раз с URL-адресом сокращения Google: https://www.googleapis.com/urlshortener/v1/url и один раз с пользовательским URL-адресом веб-сервера.Один и тот же код в автономной java выдает точно такой же запрос (как и ожидалось) в обоих случаях.На Android в случае пользовательского URL тело контента пустое и длина контента не задана.Я использую google-api-java-client 1.2.2-alpha с jackson 1.7.1.

Фрагмент кода:

    HttpTransport transport = GoogleTransport.create();
    HttpRequest request = transport.buildPostRequest();

    // Change this URL below from Google Shortener URL, to a custom URL,
    // and the code on Android produces an empty body and Content-Length is not set
    request.setUrl("GoogleAppEngine url goes here");

    JsonCContent content = new JsonCContent();
    GenericData data = new GenericData();
    data.put("id", "whatever");
    content.data = data;
    request.content = content;
    HttpResponse response = request.execute();

1 Ответ

2 голосов
/ 30 января 2011

Я провел некоторую отладку, и вот что получается:

  • по умолчанию, реализация на Android выбирает HTTP-клиента Apache для выполнения низкоуровневой передачи.Код там минимален и выглядит так, как будто он неправильно устанавливает Content-Type и Content-Length запроса.Запрос выходит, но некоторые (большинство) разборчивых веб-серверов пропускают тело.Похоже, веб-серверы Google справляются с этим нормально.Таким образом, кажется, что он отлично работает для серверов Google, но не для других веб-серверов (это немного странно, но это выходит за рамки моей проблемы).

  • по умолчаниюна Java java.net.HttpURLConnection выбирается для низкоуровневого http-транспорта.Эта реализация более многословна и аккуратно устанавливает все необходимые поля.Content-Length здесь, также как Content-Type и все остальные поля.Контент JSON сериализуется, и все веб-серверы счастливы.Включая мое пользовательское приложение GAE.

Итак, на Android следующий обходной путь решает проблему:

Поставьте следующий вызов:

HttpTransport.setLowLevelHttpTransport (new com.google.api.client.javanet.NetHttpTransport ());

ДО того, как вы выполните request.execute()

Таким образом, на Android вы 'будем использовать транспорт, который действительно работает (формируется более аккуратный запрос).

ps.Как это часто бывает в жизни, я ленился, задавал вопрос, надеясь, что кто-нибудь решит его за меня.Закончил отладку и решил ее сам ПЛЮС пришлось написать все это.Дополнительная работа - но я думаю, для всех остальных это выгодно.Надеюсь, что другие найдут это полезным.

пс.2.google api java клиент теперь рулит;) Спасибо авторам за выставление хорошей работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...