【问题标题】:How to accept a JSON POST?如何接受 JSON POST?
【发布时间】:2014-04-01 16:34:58
【问题描述】:

第一次来这里,它说要具体……所以就这样吧。

我正在做一个将 Salesforce 连接到我的 Raspberry Pi 的小项目。目标是当 Salesforce 中的客户收到高优先级案例时,让灯(想想信标,类似警报器的灯)闪烁。目前,客户通常会向某个地址发送电子邮件,这就形成了一个案例。它进入“未分配队列”并通过电子邮件向团队发送此案例正在等待分配。

Salesforce 使用 REST,所以我需要让 Pi 接受 JSON,以便它可以轻松理解 Salesforce 想要它做什么。

目前,我想我已经赢得了一半的战斗。我有一个在 Pi 上运行的 Web 服务器 (Lighttpd),它承载一个索引页面和一个 Python 脚本。我还使用了 Python 包装器,它允许我从已安装的 Telldus 程序轻松运行命令。这个程序控制我连接的一个 USB RF 发射器,它与一个 RF Socket 配对,它连接到主电源并连接一个灯。

所以 Python 脚本称为 power.py,并且可以通过 URL 变量进行控制,所以如果我转到 power.py?device=1&power=on&time=10&password=hunter2 会打开设备 1 10 秒。我还在索引页面上创建了一个 POST 表单,它只是 POSTS 到 python 脚本,并以与使用 URL 变量相同的方式运行它。这一切都很好。

所以我需要做的就是将它连接到 Salesforce。我想使用 REST 和 JSON,这样如果我从 Salesforce 转移到另一个 CRM 程序,它就可以轻松地适应和接收来自新地方的指令。

我已经发布了我在这里使用的 Python 脚本: https://github.com/7ewis/RemotePiControl/blob/master/power.py

目前不允许 Pi 离开本地网络,因此我需要以某种方式开发一种方法来发送 JSON 命令、接收并将它们转换为使用正确的变量等工作。我不是程序员,我刚刚从黑客事物和探索中接触到语言。因此,为什么我需要一些指导。

我以前从未使用过 REST 或 JSON,那么我需要做些什么来实现这一点?

【问题讨论】:

    标签: python json rest salesforce raspberry-pi


    【解决方案1】:

    似乎将 Flask http://flask.pocoo.org 添加到您的 Raspberry Pi Web 服务器将是一个不错的举措。它允许运行服务器端 python 以响应 JQuery ajax(和常规)请求。在此处查看几个示例:

    http://flask.pocoo.org/docs/patterns/jquery/

    还有这个堆栈溢出问题:how can I use data posted from ajax in flask?

    Flask 很容易启动和运行,并且很高兴与包括 Lighttpd 在内的许多服务器一起工作。写RESTful flask也是一个完全合理的命题,见:http://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask

    此外,很多人已经在树莓派上使用了烧瓶——这样可以帮助你顺利启动和运行:http://mattrichardson.com/Raspberry-Pi-Flask/

    祝你好运!

    【讨论】:

    • 啊,把我打败了。是的,使用 Flask,比打印出报表要容易得多。
    • 那我去看看 Flask!那真的是AJAJ吗?我从未真正使用过 REST 或 JSON,这是什么关系?感谢您的帮助琼!
    • 我承认,我必须查找 AJAJ,但根据 Wikipedia,AJAX 通常用于不考虑格式,所以,是的,但需要注意:) en.m.wikipedia.org/wiki/AJAJ。 Rest 和 Json 可以独立使用,所以两者之间没有特别的关系。只有两种有用的网络技术很好地结合在一起。如果这回答了您的问题,请接受带有复选标记的答案:)
    • 我不得不在 Wikipedia 上查看 AJAX 以提醒自己它是什么,这就是我遇到 AJAJ 的方式!我想我会给 Flask 一个机会。你知道我实际上必须做些什么才能让它与 Salesforce 一起工作吗?
    • 老实说,不知道。这是一个单独的问题!
    【解决方案2】:

    首先不要使用将结果直接打印到 CGI 的 Python 脚本。您将永远调试它。

    使用像 Flask 这样的轻量级框架。你可以做一些简单的事情

    from flask import Flask
    
    application = Flask(__name__)
    
    @application.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'POST':
            # use Flask's build in json decoder
            the_data = request.get_json()
            # then do something with the data
            return "This was a POST request, how interesting..."
        else:
            # request was GET rather than POST, so do something with else
            return "Hello World!"
    

    在此处查看如何配置 Flask 以使用 Lighttpd http://flask.pocoo.org/docs/deploying/fastcgi/

    如果您想对此进行测试,您可以编写另一个 Python 脚本来将 JSON 数据发送到您的服务器(我建议查看此 http://www.python-requests.org/en/latest/ 的 Python 请求库),或者您可以使用 HTTP 请求构建器手动执行此操作,例如 Firefox 的 HTTPRequester (https://addons.mozilla.org/en-US/firefox/addon/httprequester/)

    【讨论】:

    • 不好意思,不知道第一句话是什么意思,ELI5(主要是CGI位)?因此,使用该代码(文件扩展名是什么?)我可以向它发送 HTTP POST,它会返回相应的消息?看起来相当简单!然后我只需要包含一些 JSON,但是我如何让它理解它,并运行 Python 命令/脚本来打开灯?我去看看插件。谢谢!
    • 首先,解释我所说的第一句话的意思:在您的示例代码中,您有很多打印语句正在产生服务器的输出。 Lighttpd Web 服务器运行 Python 脚本并获取这些打印语句的输出并将它们返回到 Web 浏览器。这可行,但它非常混乱且难以调试,例如您正在构建自己的 HTTP 标头(顶部的“Content-Type”位)。如果你想改变一些东西,你需要做很多工作。像 Flask 这样的框架将为您完成所有这些工作,因此您不必担心
    • 其次,JSON 位。 Flask 有一个函数,它接收你 POST 到服务器的 HTTP 请求的主体,并将其从 JSON 转换为 Python 字典。因此,如果您将 {"variable_name":"variable_value"} 发布到服务器,Flask 会将其转换为 Python 字典 {variable_name: "variable_value"} 您可以检查发送的内容。这就是上面“the_data”变量中的内容。
    • 我想我明白了,谢谢。 Flask 可以自己做所有事情,还是最好保留 Lighttpd?而且安装Flask后,不需要任何设置,安装后,它会立即接受JSON?完成此操作后,如何发送测试 POST?
    • 你不需要将 Flask 放在 Lighttpd 后面,你可以将 Flask 作为自己的独立服务器启动。如果您在生产中运行大型应用程序,建议在 HTTP 服务器后面运行,但这是为了扩展、稳定性、安全性和易于部署。对于一个小型的个人项目,它应该不是必需的,并且会让您在让 Lightttp 启动您的 Python 代码时省去一些麻烦。 Flask 开箱即用地处理 JSON。只需向它发布一些 JSON 数据(使用 Firefox 中的 HttpRequester 之类的东西),它就会处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2022-08-20
    • 2014-02-20
    相关资源
    最近更新 更多