我之前已经问了几个问题,但仍然没有解决我的问题。
我正在尝试允许Salesforce通过JSON(REST API)远程向Raspberry Pi发送命令。 Raspberry Pi通过名为TellStick的射频发射器控制一些射频插头的功率。这是所有设置,我可以使用Python发送这些命令。现在我需要做的就是让Pi接受JSON,然后找出如何从Salesforce发送命令。
有人在GitHub上分享了我的回购,并为我提供了一些可以使它工作的代码。但不幸的是它仍然没有用。
以上是上一个问题:How to accept a JSON POST?
以下是分叉回购:https://github.com/bfagundez/RemotePiControl/blob/master/power.py
我需要做什么?我已经在Postman扩展和cURL中发送了测试JSON消息,但一直收到错误。
我只是希望能够发送各种变量,并让脚本完成其余的工作。
我现在可以发布一个带有一些URL变量的.py脚本,所以/python.py?power=on&device=1&time=10&pass=whatever
就可以了解它。当然有一种简单的方法可以用JSON发送它吗?
这是power.py代码:
# add flask here
from flask import Flask
app = Flask(__name__)
app.debug = True
# keep your code
import time
import cgi
from tellcore.telldus import TelldusCore
core = TelldusCore()
devices = core.devices()
# define a "power ON api endpoint"
@app.route("/API/v1.0/power-on/<deviceId>",methods=['POST'])
def powerOnDevice(deviceId):
payload = {}
#get the device by id somehow
device = devices[deviceId]
# get some extra parameters
# let's say how long to stay on
params = request.get_json()
try:
device.turn_on()
payload['success'] = True
return payload
except:
payload['success'] = False
# add an exception description here
return payload
# define a "power OFF api endpoint"
@app.route("/API/v1.0/power-off/<deviceId>",methods=['POST'])
def powerOffDevice(deviceId):
payload = {}
#get the device by id somehow
device = devices[deviceId]
try:
device.turn_off()
payload['success'] = True
return payload
except:
payload['success'] = False
# add an exception description here
return payload
app.run()
答案 0 :(得分:1)
要检索Json Post值,您必须使用request.json
if request.json and 'email' in request.json:
request.json['email']
答案 1 :(得分:1)
您的deviceID
变量是字符串,而不是整数;它包含一个'1'
数字,但这还不是一个整数。
您可以明确转换它:
device = devices[int(deviceId)]
或告诉Flask你想在路线中使用整数参数:
@app.route("/API/v1.0/power-on/<int:deviceId>", methods=['POST'])
def powerOnDevice(deviceId):
其中int:
部分为URL route converter。
您的视图应该返回响应对象,字符串或元组而不是字典(就像您现在一样),请参阅About Responses。如果您想返回JSON,请使用flask.json.jsonify()
function:
# define a "power ON api endpoint"
@app.route("/API/v1.0/power-on/<int:deviceId>", methods=['POST'])
def powerOnDevice(deviceId):
device = devices[deviceId]
# get some extra parameters
# let's say how long to stay on
params = request.get_json()
try:
device.turn_on()
return jsonify(success=True)
except SomeSpecificException as exc:
return jsonify(success=False, exception=str(exc))
我还修改了异常处理程序以仅处理特定的异常;尽量避免Pokemon exception handling;不要试图抓住它们!