Google Glass callbackUrl POST из Mirror API пуст?

Извинения, потому что единственная веб-разработка, которую я знаю, относится к типу django/python и, вероятно, виновна в смешении моих идиом кода ( REST vs django рабочий процесс отправки URL)

У меня есть обработчик URL, который служит callbackUrl для подписки на мою посуду из стекла. Я получаю POST для обработчика, но объект запроса кажется пустым.

Я уверен, что я понимаю это неправильно, но может кто-то указать мне направление получения информации "ОТВЕТИТЬ" из уведомления POST в callbackURL.

Мой URL-обработчик

class A600Handler(webapp2.RequestHandler):

def post(self):
    """Process the value of A600 received and return a plot"""
    # I am seeing this in my logs proving that I am getting a POST when glass replies
    logging.info("Received POST to logA600")
    # This is returning None
    my_collection = self.request.get("collection")
    logging.info(my_collection)
    # I also tried this but self.sequest.POST is empty '[]' and of type UnicodeMultiDict
    # json_request_data = json.loads(self.request.POST)


@util.auth_required
def get(self):
    """Process the value of A600 received and return a plot"""
    logging.info("Received GET to this logA600")

Я определил следующий URL-обработчик и могу убедиться, что функция post получает "ping", когда пользователь нажимает на ответ, просматривая журналы ядра приложения.

MAIN_ROUTES = [ ('/', MainHandler),('/logA600',A600Handler), ]

Как извлечь полезную нагрузку в виде транскрибированного голосового текста, отправленного пользователем? Я не понимаю Пример "parse_notification", приведенный в документации

2 ответа

Решение

Ты пробовал request.body? Документы для request.POST государство

"Если вам нужен доступ к необработанным или неформальным данным, размещенным в запросе, используйте это вместо атрибута HttpRequest.body".

Если API не использует данные формы в своем посте, вы, скорее всего, найдете его в request.body, Документы, на которые вы ссылаетесь, указывают, что содержимое будет помещено в тексте в виде JSON вместо данных формы ("содержащих JSON тело запроса "). Я бы попробовал json.loads(request.body),

У меня также возникает проблема с Mirror API, вызывающей мое приложение для уведомлений, и эти уведомления пусты. Мое приложение работает на Tomcat, так что это стек Java. Все образцы обрабатывают уведомление следующим образом:

BufferedReader notificationReader = new BufferedReader(
                new InputStreamReader(request.getInputStream()));
        String notificationString = "";

        // Count the lines as a very basic way to prevent Denial of Service
        // attacks
        int lines = 0;
        while (notificationReader.ready()) {
            notificationString += notificationReader.readLine();
            lines++;

            // No notification would ever be this long. Something is very wrong.
            if (lines > 1000) {
                throw new IOException(
                        "Attempted to parse notification payload that was unexpectedly long.");
            }
        }

        log.info("got raw notification " + notificationString);

Для меня это всегда логирование как пустое. Поскольку URL-адрес уведомления должен быть https, а для тестирования я не мог использовать IP-адрес, я настроил службу dyndns, чтобы указать на мой localhost:8080 работающий сервис. Кажется, что все это работает, но я подозреваю, что dyndns работает, если какой-то тип переадресации или перенаправления здесь удаляет данные.

Как я могу обойти это для местного развития?

Обновлено: Решено для меня. Я обнаружил, что закрытие ответа до того, как запрос на чтение вызвал проблему, запрос.inputStream уже был закрыт. Двигая это

response.setContentType("text/html");
Writer writer = response.getWriter();
writer.append("OK");
writer.close();

Чтобы после того, как я полностью прочитал в запросе уведомление в строку, решил проблему.

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