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();
Чтобы после того, как я полностью прочитал в запросе уведомление в строку, решил проблему.