如何在Flask中接收和处理JSON?

0 投票
1 回答
1458 浏览
提问于 2025-04-17 23:58

我有一个树莓派的设置,需要能够接收来自Salesforce的JSON数据。我对JSON不太熟悉,但我觉得这可以通过REST API来实现。

无论如何,我已经下载了Flask,这个工具应该能帮我完成这个任务。当它接收到这个JSON数据时,我需要它能和我已经设置好的Python脚本一起工作,或者以相同的方式运行这个脚本。(这个脚本在这里:这里)。这个脚本可以远程控制一些电源插座,我希望Salesforce能够在触发时打开一个插座。目前为止,我可以通过网页界面控制电源,使用URL变量或者表单的POST请求。这一切都运行得很好。

我现在正处于最后阶段,也是我经验最少的部分。Salesforce发送的JSON数据会是什么样的?我该如何解析这些数据,并通过Python来控制电源插座呢?

1 个回答

2

你的计划是这样的:

[Salesforce] <---> [Flask API] <--> [Raspberry PI]

Salesforce 会生成 JSON 消息,这些消息需要发送到你的 Flask API,Flask API 会和 Raspberry PI 进行交互。

我看到你已经准备好与 Raspberry PI 的交互了,所以你应该在 Flask 中创建一些可以从外部触发的接口。

这里有一些 Flask 接口的例子:

# 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.get(deviceId)
    # get some extra parameters 
    # let's say how long to stay on
    params = request.get_json()
    try:

      device.turn_on(params['durationinminutes'])
      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.get(deviceId)
    try:
      device.turn_off()
      payload['success'] = True
      return payload
    except:
      payload['success'] = False
      # add an exception description here
      return payload

在 Salesforce 这边,你需要创建一个对象结构来跟踪设备,但我想给你展示一下发送 JSON 消息到你的 Flask API 所需的 APEX 代码。

你会有一个 DevicesController 类,这个类里面会有一些方法,这些方法会从一个叫 Devices.page 的页面被触发。

举个例子,你会有一个方法可以打开设备:

// this should return something but for the sake of simplicity
public void turnDeviceOn(String externalDeviceId, Integer durationInMinutes){
 # generate json message
 JSONGenerator gen = JSON.createGenerator(true);
 gen.writeStartObject();
 gen.writeIntegerField('durationinminutes', durationInMinutes);
 gen.writeEndObject();
 # generate http request

 HttpRequest req  = new HttpRequest();
 req.setMethod('POST');
 # this endpoint must be added as a remote endpoint in Salesforce org setup!
 req.setEndpoint('http://yourapiurl/API/v1.0/power-on/'+externalDeviceId);
 req.setBody(gen.getAsString());

 HTTPResponse res = h.send(req);

}

请注意,这只是一个基本的 Salesforce <--> Flask API 的例子。 你需要添加一个认证机制,并对整个流程进行更多的控制。

编辑:

因为你问这个能否添加到你的代码中,我已经复制了你的代码库,并把那个 Flask 接口的代码整合到你的 power.py 文件里。 最好的解决方案是把它放在一个单独的类中,并在不同的文件中处理路由,但为了让你理解,可以把它们放在一起。

你可以克隆它,安装 Flask 模块:

pip install flask

然后用以下命令执行它:

python power.py

接着用以下命令测试接口:

curl -X POST  http://localhost:5000/API/v1.0/power-on/<deviceid>

撰写回答