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

时间:2014-03-26 12:36:06

标签: python json rest post salesforce

我有一个Raspberry Pi设置,需要能够接收JSON(来自Salesforce)。我对JSON不是很熟悉,但我相信这可以通过REST API实现。

无论如何,我已经下载了Flask,它应该能为我做到这一点。当它收到这个JSON时,我需要它来处理Python脚本,或者像我已经设置的这个脚本一样工作。 (这是脚本:here)。该脚本远程控制一些电源插座,我希望Salesforce能够在触发时转一个电源插座。到目前为止,我可以使用URL变量或表单中的POST从Web界面控制Power。这一切都运作良好。

我只是在最后阶段,也是我最不经验的那个.JSON Salesforce可以发送什么样的?我如何解析这个并让它通过Python控制Power Outlets?

1 个答案:

答案 0 :(得分:1)

您的计划如下:

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

Salesforce将创建必须发送到与raspberry交互的Flask API的JSON消息。

我发现您已准备好与Raspberry PI的交互,因此您应该创建从外部触发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类,它将具有将从visualforce页面触发的方法,例如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&lt; - &gt; Flask API示例。 您需要在整个流程中添加身份验证机制和更多控制。

编辑:

因为您询问是否可以将其添加到您的代码中I've forked your repo and integrated that flask endpoint code to your power.py file. 最好的解决方案是你应该将它放在一个单独的类上并处理不同文件上的路由,但可以将它们放在一起,这样你就能得到这个想法。 您可以克隆它,安装Flask模块:

pip install flask

并执行:

python power.py

然后用:

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