Скрипт приложения Google: использование веб-приложения ContentService

Я застрял на 3 дня, пытаясь заставить 2 гаджета Google надежно общаться на сайте Google для обмена информацией о сеансе анонимного пользователя на основе значения UiInstance.getId (). Поскольку функция pubsub между гаджетами устарела, я пытаюсь использовать ContentService в серверном гаджете для обслуживания запроса doPost, исходящего от клиентского гаджета - идея в том, что я сохраню информацию о сеансе в серверном гаджете и извлечу данные в гаджеты на других страницах сайта - не уверен, возможно ли это.

НО, я застрял, даже пытаясь повозиться с различными примерами ContentService, опубликованными на StackOverflow. Я застрял на очень простом шаге и не могу выйти за рамки сверхпростого серверного кода, приведенного ниже. Я не могу понять, какой URL-адрес серверного гаджета мне нужно использовать из моего клиентского гаджета. Кажется, я получаю запутанные результаты.

Код сервера:

function doGet(e) {
  var output = ContentService.createTextOutput();
  output.setContent("Hi from ContentServer!");
  return output;
}

Шаги, которые я сделал:

1) Опубликовал сервер как веб-приложение и настроил его так, чтобы любой / анонимный пользователь мог получить к нему доступ.

2) Всплывающее окно публикации сообщает, что гаджет доступен по адресу google.com/macros/s/AKfycbyIa07kBC-gqG0nJq3Up5GzUntbTaYcM1KmaYF7vQvFIWN_qxA/exec

3) Если я использую браузер для открытия ссылки, я получаю «Неизвестный макрос doGet».

4) Если я нажму на ссылку «Проверить веб-приложение для вашего последнего кода». из публикации всплывающего окна, кажется, взять меня к https://script.googleusercontent.com/echo?user_content_key=WwuWW_Hhp2wlHpHWsX-qAwu7jtKrwlt1fkkesojKEWeJXKm5AoUOhuRHxu4RIHLrWovOBUsHhOB3No0RYr05RE4tWtliFlXKm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnG5I1NuldcVdfVF6dOROkmljXtr0dWIARhfeRbamxWJIIJeMc5tWnrGPpehwqDtynQ&lib=MfYY3NqJ0IdcpreIfwd3uwgmzn1S_adTp

Приведенная выше ссылка из шага 4 работает в браузере, НО она очень нестабильна с моего клиентского гаджета! Кажется, он работает в самый первый раз, когда я публикую и публикую его, но возвращает необработанный HTML, если я обновляю версию хотя бы один раз.

Я считаю, что мне не хватает какого-то тривиального шага, ИЛИ существует серьезная ошибка контроля версий или развертывания гаджетов веб-приложений.

Я проверил следующие потоки в stackoverflow, которые были очень полезны. Как использовать ContentService и doPost для создания REST API

KamilG, похоже, решил проблему здесь Другой doGet () проблема с скриптом Google Apps - неизвестная ошибка макроса doGet

Но для меня это очень шатко, и я не могу определить какую-либо надежную процедуру, чтобы получить ContentService, работающий с моего серверного гаджета.

Мы будем очень благодарны за любую помощь и объяснение.

Вот код моего клиентского гаджета.

function doGet(e) {
//  var url = "https://script.google.com/macros/s/AKfycbyIa07kBC-gqG0nJq3Up5GzUntbTaYcM1KmaYF7vQvFIWN_qxA/exec";
  //var url = "https://script.googleusercontent.com/echo?user_content_key=9tzQxTSPm8ADsHKl4bCg6ru-49C19kYZCW8IRuWiWi-Xe_lTlQZS4xq8v5aPqjR6Ybj7-xjjJXyQPhOH0T3KFtJUtXc7U-Dkm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnJlCLn2pnKC0O1TYz53ccgjxtVC9ccM8kFegFJ0AJSK_YP_ylqfjfm1EU_BUbZUu-88PMDJ6xpj8&lib=MTLHdJRs3UPYj3bYgbhBNnNGZ7UmftE34";
  var url = "https://script.googleusercontent.com/echo?user_content_key=LvlwGkBktQ732xyD1HJbh5OhMsuhkidt_rOovw-olm-wJQF4LlErMDSxsfDaAb4UBYqOeTI3-8soIBj-KaOCDi0WlUav4Nl_m5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnG5I1NuldcVdfVF6dOROkmljXtr0dWIARhfeRbamxWJIIJeMc5tWnrGPpehwqDtynQ&lib=MfYY3NqJ0IdcpreIfwd3uwgmzn1S_adTp";

  // WELL ONE OF THE URLS WORKS FROM ABOVE!!! BUT ONLY TILL I UPDATE THE SERVER WEB APP VERSION :(

  var app = UiApp.createApplication().setTitle("ClientService Client test");
  app.setStyleAttribute("background", "azure");

  var fetchMethod = 'get';
  var response = UrlFetchApp.fetch(url, {method: fetchMethod});

  //var lbl = app.createHTML("<b>Response :</b>" + response.getContentText());
  var lbl = app.createTextArea().setText(response.getContentText());

  var lbl1 = app.createHTML("<b>Response code :</b> "
                            + response.getResponseCode()); 

  app.add(lbl);
  app.add(lbl1);
  return app;
}

Нужна помощь, пожалуйста.


person Siva    schedule 09.11.2012    source источник


Ответы (1)


По большей части это функционирует так, как задумано, но я думаю, что есть некоторые альтернативы.

  1. Что касается вашего пункта № 3 - этот URL-адрес выше работает. Должно быть, что-то не так с версией, которую вы тестировали (возможно, вы неправильно объявили doGet?).
  2. Ссылка из №4 - это одноразовое перенаправление, которое происходит, когда вы используете Content Service. См. Раздел перенаправления здесь полностью внизу. Эта ссылка недолговечна, и вы можете быть достаточно быстрыми, чтобы поймать ее в браузере, но другому отдельному вызывающему клиенту («гаджету») может не повезти. Поэтому никогда не следует вызывать ссылку googlecontentservice.com напрямую.
  3. Что касается общей проблемы ненадежности ContentService, я этого не видел. Если я правильно использую ссылку / exec, а затем правильно увеличиваю версию после каждого соответствующего изменения, у меня все работает так, как ожидалось.

Я создал простое веб-приложение для доступа к вашей Content Service, и, похоже, у меня все работает нормально. См. ниже. Код выглядит так же, как ваш, но я использую первый URL.

https://script.google.com/macros/s/AKfycbw6nlfv5ME6F3Z2WBdW24YAgfQm_E5gYV0xrMDvDwZLrX7PdMU/exec

В качестве альтернативы - есть ли причина, по которой вы выполняете UrlFetch на стороне сервера от одного скрипта к другому? Если вы можете получить данные на стороне сервера данных, можете ли вы просто выполнить логику сценария содержимого с помощью сценария пользовательского интерфейса?

person Arun Nagarajan    schedule 09.11.2012
comment
Спасибо, Арун, я вижу последовательное поведение ваших указателей. Я предполагаю, что использование URL-адреса googleusercontent привело меня в замешательство. В основном мне нужно управление сеансом для анонимного пользователя. Классы Browser и Session не имеют уникального ключа для отслеживания сеанса для сервера. Есть ли способ отслеживать сеансы между страницами сайта, не требуя от пользователя входа в систему через учетную запись Google? Я начал изучать API-интерфейсы ContentService doPost / doGet, чтобы увидеть, смогу ли я достичь вышеуказанного. Пожалуйста, предоставьте любые альтернативные идеи, которые я могу реализовать, если ContentService не подходит для этого. Также я отредактировал заголовок. - person Siva; 09.11.2012