1

我有一个带有书籍列表的数据表。下面是我的sql语句:

SELECT `Book`.`id` , `Book`.`name` , `Book`.`isbn` , `Book`.`quantity_in_stock` , `Book`.`price` , (`Book`.`quantity_in_stock` * `Book`.`price`) AS `sales`, concat(`Author`.`name`, ' ', `Author`.`surname`) AS `author`  
FROM `books` AS `Book` 
LEFT JOIN authors AS `Author` 
ON ( `Book`.`author_id` = `Author`.`id` ) 
WHERE  (`Book`.`quantity_in_stock` * `Book`.`price`) > 5000.00

查询工作正常,工作流程也工作正常。但是,我想通过 API 访问它并通过变量 bar 使 5000.00 值可配置。

问题是如何使这成为可能,以便当我使用下面的端点调用我的 API 时它可以工作?

https://domain.flowgear.io/5000booklist/{sales_value}

我想要的是能够通过 API 重用我的工作流程,并且只传递我想要查询表的销售值。销售价值可以是 2000 或 5000,具体取决于我想要实现的目标。

4

2 回答 2

2
  1. 添加一个变量 bar 并向其添加一个名为“salesValue”的属性
  2. 在工作流详细信息窗格中,提供此 url:“/booklist/{salesValue}” - 大括号中的值必须与变量 bar 中的属性名称匹配
  3. 添加一个格式化程序,将包含“WHERE ( Book. quantity_in_stock* Book. price) > {salesValue}”的 SQL 模板放在 Expression 属性中,然后添加一个名为 salesValue 的自定义字段,并将其从变量 bar salesValue 属性中固定。将转义设置为 SQL。
  4. 获取格式化程序的输出并将其插入 SQL 查询连接器的 SQL 查询属性。
  5. 添加另一个变量 bar,并添加特殊属性 FgResponseBody 和 FgResponseContentType
  6. 将 SQL 结果固定到 FgResponseBody 并将 FgResponseContentType 设置为 'text/xml'

如果要返回 JSON,请使用 JSON Convert 将 SQL 查询的结果转换为 JSON,然后将其固定到 FgResponseBody 并将 FgResponseContentType 设置为 'application/json'

于 2014-09-24T06:57:41.370 回答
0

@sanjay 我将尝试向您概述我当时在按照此处的说明通过 PHP 试验 Flowgear 时所做的事情。

我不确定您是否还通过 PHP 或任何其他语言调用 Flowgear REST API,但无论如何我认为逻辑应该保持不变。

我所做的是将 PHP CURL 示例代码包装在一个类中,以便能够重用它。下面是我为一个简单的选择查询编写的代码:

<?php

 //Require the FlowgearConnect class
 require_once '/path/to/flowgear_class_with_api_call.php';

try{

   $workflow = new FlowgearConnect(return include 'endpoints.php');

   $serial = $_POST['serial'];
   $clientId = $_POST['client_id'];

   //Get the results
   $sql = '';
   if(empty($serial)){
     $conditions = sprintf(' `a`.`client_id` = %s AND `a`.`serial` > -1 ORDER BY `a`.`serial` ASC', $clientId);
    }else{
      $conditions = ' `a`.`serial` = ' . $serial;
   }

   /**
    In your workflow you will most probably have a VARIABLE BAR that holds your request parameters which is what $conditions speaks to.
   */
    $conditions = array('conditions' => $conditions);

    $results = $workflow->getResults('orders', 'orders', $conditions);
}catch(catch any exceptions thrown by the API here){
  //Log the exceptions here or do whatever
}

上面的列表应该是不言自明的。下面我将向您展示我在 FlowgearConnect 类中使用的功能。这不是标准方式,因为您可以根据需要以不同方式配置代码。

//FlowgearConnect constructor
class FlowgearConnect
{
 protetced $endpoints = [];

  protected $domain = "https://your-domain.flowgear.io";

  public function __construct(array $endpoints)
  {
    $this->endpoints = $endpoints;
   }

  public function getResults($model, $workflow, $options= array())
  {
     $endpoint = $this->getEndpoint($model, $workflow);

     $results = array();
     if(!empty($endpoint)){
        $results = FlowgearInvoke::run($authOpts, $endpoint, $options, array('timeout' => 30)); 
      }
      return $results;
   }

   ....
}

如前所述,enpoints.php 文件仅从 flowgear 控制台中返回一组配置的端点和/或工作流名称。下面是我的样子的摘录:

return array(
    'orders' => array(
         'shipped_orders' => '/shipped_orders',
         //etc
       ),
     'items' => array(
        'your_model' => '/workflow_name_from_flowgear_console',
       ),
  );

这只是一个使用 PHP 的 Flowgear REST API 的基本选择查询。如果幸运的话,您应该按照为工作流程配置响应正文的方式获取记录。

下面是一个典型的工作流测试以及你应该在你的 API 中得到什么。

我建议您首先在您的 flowgear 控制台上创建您的工作流程,并确保生成所需的输出并提取您想要更改的部分,而不是您的查询,将它们移动到您的请求的变量栏并在运行时将它们注入 -时间取决于您希望实现的目标。这种解释可以替代其他操作,例如更新和/或删除。最好的办法是先了解 flowgear,并确保在尝试创建一个安静的交互式应用程序之前,你可以在那里完成所有工作。 在此处输入图像描述

警告:我使用这个平台已经一年多了,所以你可能会发现其中的错误,但我希望它会引导你找到解决问题的方法。如果没有,那么也许您可以创建一个 repo 并让我检查一下,看看您是如何配置所有内容的。

于 2016-01-05T08:49:10.747 回答