2

抱歉,因为我知道的唯一 Web 开发是 django/python 类型的,并且可能因为混合了我的代码习语而感到内疚(REST 与 django URL 调度工作流)

我有一个 URL 处理程序,它用作我 Glassware 订阅的 callbackUrl。我收到了处理程序的 POST ,但请求对象似乎是空的。

我确定我理解这个错误,但有人可以指出我从 POST 通知获取“REPLY”信息到回调 URL 的方向。

我的 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”示例

4

2 回答 2

4

你试过了request.body吗?状态文档request.POST_

“如果您需要访问请求中发布的原始或非表单数据,请改为通过 HttpRequest.body 属性访问。”

如果 API 在其帖子中未使用表单数据,您可能会在request.body. 您链接到的文档表明内容将作为 JSON 放置在正文中,而不是表单数据(“包含JSON请求正文”)。我会尝试json.loads(request.body)

于 2013-07-18T18:59:23.977 回答
0

我也有这个镜像 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 的工作方式是某种类型的转发或重定向,此处删除了帖子数据。

我该如何解决这个问题以促进本地发展?

更新:为我解决了。我发现在读取请求之前关闭响应导致 request.inputStream 已经关闭的问题。移动这个

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

在我将请求通知完全读入字符串后解决了这个问题。

于 2013-09-26T01:40:59.573 回答