【问题标题】:Python - Accept POST (raw body) dataPython - 接受 POST(原始正文)数据
【发布时间】:2016-03-26 17:24:32
【问题描述】:

我对 Python 完全陌生。我正在使用 GitLab,它提供了系统挂钩功能,其中我可以指定一个 URL,它将以 JSON POST 数据的形式发送事件详细信息。当我创建一个 RequestBin URL 并在 GitLab 的系统挂钩中提供该 URL 时,如果发生任何事件(例如项目创建),它会发送事件详细信息,我可以在 RequestBin 中看到相同的内容,如下面的快照所示。

现在,我想在某个变量中获取此 JSON 数据,以便我可以根据需要对其进行处理,但我不确定如何读取该数据。

我看过一些解释如何读取 JSON 数据的帖子,但正如您在下面的屏幕截图中看到的那样,FORM/POST PARAMETERS 显示为 None。它是包含所有细节的原始正文(JSON 格式):

我尝试使用 Java 读取数据,它可以与下面显示的代码一起使用:

String recv;
String recvbuff="";
BufferedReader buffread = new BufferedReader(new InputStreamReader(request.getInputStream()));

while ((recv = buffread.readLine()) != null)
recvbuff += recv;
buffread.close();

System.out.println(recvbuff);
out.println(recvbuff);

在 Python 中寻找类似的东西。

【问题讨论】:

  • 所以如果我理解正确,您正在寻找一种方法来设置一个简单的 Python 服务器来处理一些 JSON-POST 请求?我建议使用 CherryPy,很容易设置一些接受 JSON 调用的函数 docs.cherrypy.org/en/latest/basics.html#dealing-with-json
  • CherryPy 是 Apacher 服务器的替代品吗?此外,请求是 JSON 格式,但它是作为原始数据发送的,所以我不确定你的建议是否可行。
  • 投票结束,因为您没有具体问题
  • @AlastairMcCormack:为什么没有具体问题?它写在主题本身中,即从 POST 请求接收原始数据。问题是我不知道如何在 Python 中接受数据。我是使用 Tomcat + JSP + jq + shell 完成的,但这看起来不是一个好方法,所以我想尝试使用 Python。
  • Python 不处理 HTTP 请求,实际上,框架/模块/库可以。你已经用一些不完整的 Flask 代码更新了你的问题,但没有显示你是如何测试它的。你的问题太宽泛、太随意、太分散、太模糊,无法写出好的答案。作为与您一样享有盛誉的人,您应该已经提出了很好的问题,但为了他人和您的利益,请参阅:stackoverflow.com/help/how-to-ask

标签: python json post


【解决方案1】:

我建议使用CherryPy。这是一个简洁的 Python 库,允许您构建一个简单的网络服务器应用程序,它非常适合您的用例:它可以轻松接受 JSON 请求 (http://docs.cherrypy.org/en/latest/basics.html#dealing-with-json)。

如果您使用以下代码编写名为 myserver.py 的文件:

#!/usr/bin/python3
import cherrypy

class Root(object):
    @cherrypy.expose
    @cherrypy.tools.json_in()
    def index(self):
        data = cherrypy.request.json
        # You can manipulate here your json data as you wish
        print(data['name'])

if __name__ == '__main__':
    cherrypy.quickstart(Root(), '/')

您可以简单地使用命令行启动服务器:

python3 myserver.py

并使用以下 curl 命令对其进行测试:

curl -H "Content-Type: application/json" -POST http://127.0.0.1:8080 -d '{"name": "test", "path": "/"}'

然后您将看到test 打印在您的服务器日志中。

【讨论】:

  • 我尝试了您的建议并且 your curl 命令有效,但是当我将此 URL 提供给我的应用程序的网络挂钩时,​​日志不显示任何内容。正如我在 AlastairMcCormack 的评论中提到的,我已经成功地使用 Java 测试了 web 挂钩,但是涉及的工具太多,我想要一种 更好的 方法来完成同样的工作。 :( 响应肯定是由应用程序作为 JSON(如屏幕截图所示)发送的,但它是原始数据(再次如屏幕截图所示)。所以,我可能必须读取所有发送的数据,而不仅仅是 JSON正文(不包含实际输出)。
  • 那么您的应用程序是否在与您的 myserver.py 文件相同的服务器上运行 webhook?因为 127.0.0.1:8080 是本地地址,无法从本地网络外部访问。如果您想绑定您的服务器 IP 地址,只需查看 stackoverflow.com/questions/115773/… 中的第二个答案
  • 是的,应用程序在同一个 IP 上运行,我尝试使用公共和私有 IP,但无济于事。
  • 甚至没有一行表明有某种请求?如果您使用nc -l 8080 而不是myserver.py,您会看到任何请求的迹象吗?如果不是(并且 curl 有效),您的 webhook 看起来好像不起作用,也许您的 Java 代码以另一种方式获取它的信息?
  • 不会有这样的请求,因为我没有发送任何请求; GitLab 应用程序会在其中发生任何事件(例如项目创建、项目删除等)时触发挂钩。我已经使用有效的 Java 代码更新了我的帖子。希望这能给你一些关于我想要传达的信息的线索。
【解决方案2】:

您的 Flask 应用程序不会返回任何数据,因此您不会看到任何返回的数据。您需要返回如下内容:

return "test data"

您的屏幕截图仅显示请求而不是响应。您没有发送任何表单编码参数,这就是它显示“无”的原因。

JSON 的正确内容类型是:application/json

【讨论】:

  • 当您提到屏幕截图显示响应时,我不确定您的意思。我在 RequestBin 中创建了一个链接,并在我的应用程序的 web 挂钩中分配了它。每当触发任何事件(例如项目创建等)时,它都会以 JSON 的形式发送有关该事件的详细信息,并将其作为原始数据发送,这是我想在某个变量中接受的数据,以便我可以处理它。跨度>
  • 请重新阅读我的回答。它说“只显示 request 而不是响应”。我不知道 RequestBin 是如何工作的,但屏幕截图的所有元素都是请求的上下文不是响应
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多