如何接受一个JSON POST请求?

4

首次到这里,需要具体说明...所以请听我说。

我正在做一个小项目,将Salesforce连接到我的树莓派上。目标是当来自Salesforce客户端的高优先级案例到达时发出一个灯光(想象一下蜂鸣器或类似的灯光)闪烁。目前,客户通常会发送电子邮件到特定地址,这将创建一个案例。它进入“未分配队列”并通过电子邮件通知团队此案例等待被分配。

Salesforce使用REST,因此我需要使Pi能够接受JSON,以便它可以轻松地理解Salesforce要求它执行的操作。

目前,我想我已经完成了其中一半。我在Pi上运行一个Web服务器(Lighttpd),用于托管索引页面和Python脚本。我还使用了Python包装器,它允许我轻松地从我安装的Telldus程序中运行命令。该程序控制我连接的USB RF发射机,它与连接到主电源的RF插座配对,并连接了灯。

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

因此,我需要做的一切就是将其连接到Salesforce。我想使用REST和JSON,这样如果我将来从Salesforce移动到另一个CRM程序,它将轻松地适应并接收新位置的指令。

我在此处发布了我正在使用的Python脚本:https://github.com/7ewis/RemotePiControl/blob/master/power.py

Pi目前不允许离开局域网,因此我需要开发一种方法来发送JSON命令,并且接收和转换它们以使用正确的变量等进行工作。我不是程序员,我只是从黑客事物和探索中获得了编程语言的知识。因此,我需要一些关于此的指导。

我之前从未使用过REST或JSON,那么我需要做什么才能实现这一点呢?

2个回答

3

看起来将Flask http://flask.pocoo.org添加到你的树莓派Web服务器上是一个不错的选择。它允许在JQuery ajax(和常规)请求的响应中运行服务器端Python。在这里查看一些示例:

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

还有这个stackoverflow的问题:如何在flask中使用从ajax发布的数据?

Flask很容易上手,并且可以与多个服务器一起使用,包括Lighttpd。编写RESTful flask也是一个完全合理的建议,参见:http://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask

此外,许多人已经在树莓派上使用了flask - 所以这可能有助于您顺利启动:http://mattrichardson.com/Raspberry-Pi-Flask/

祝你好运!


1
啊,你比我先说了。是的,使用Flask会更容易,比打印语句要简单得多。 - Cormac Mulhall
我会看一下Flask!那么它实际上是AJAJ吗?我从未使用过REST或JSON,它们之间有什么关系?感谢您的帮助Joan! - Lewis Lebentz
我承认,我不得不查AJAJ的定义,但根据维基百科的解释,AJAX通常不考虑格式,所以是可以使用的,但有一个警告:) http://en.m.wikipedia.org/wiki/AJAJ。Rest和Json可以独立使用,因此两者之间没有特定的关系。它们只是两种非常好搭配的有用的Web技术。如果这回答了你的问题,请用勾号接受答案:) - Joan Smith
我不得不在维基百科上查看AJAX以提醒自己它是什么,这就是我发现AJAJ的方式!我想我会尝试使用Flask。但是你知道我实际上需要做些什么才能使其与Salesforce配合工作吗? - Lewis Lebentz
说实话,我不知道。那是一个独立的问题! - Joan Smith
好的,谢谢Joan!我现在已经接受了你的回答。我现在已经安装了Flask,并且正在努力弄清楚如何解析请求并将其转发到Python脚本。 - Lewis Lebentz

0
首先不要使用直接将结果打印到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数据发送到您的服务器(我建议查看Python Requests库http://www.python-requests.org/en/latest/),或者您可以使用HTTP请求构建器手动执行此操作,例如 Firefox 的 HTTPRequester(https://addons.mozilla.org/en-US/firefox/addon/httprequester/


啊,我明白了。现在我已经可以接收JSON了,但是我该如何告诉它如何处理这段代码呢? - Lewis Lebentz
Flask将JSON转换为Python字典。只需查询该字典并根据其中的内容执行操作,例如:如果my_json_stuff ['power_on'] == True等。 - Cormac Mulhall
字典在哪里?在.py文件中还是其他地方?它还使用了Python Wrapper,那么这仍然有效吗?我在原帖中链接到了.py脚本,这行得通吗? - Lewis Lebentz
我会阅读一下。谢谢。我该如何从 Chrome 扩展程序(例如 Postman 或 Advanced REST Client)发送带有该内容类型的测试 POST 请求? - Lewis Lebentz
没问题,Postman可以用。我个人更喜欢HttpRequester,它是Firefox的一个插件。它拥有你所需的一切,而且我发现它比Postman更容易使用。https://addons.mozilla.org/en-US/firefox/addon/httprequester/ - Cormac Mulhall
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接