发送数据到 Web 服务

创建一个规则,将所有发送自 client_id=’Steven’ 的消息,转发到地址为 ‘http://127.0.0.1:9910 发送数据到 Web 服务 - 图1 (opens new window)‘ 的 Web 服务器:

首先我们创建一个简易 Web 服务,这可以使用 nc ​ 命令实现:

  1. $ while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 9910; done;

使用 WebHook 类型创建一个资源,并配置资源参数 url:

1). 列出当前所有可用的资源类型,确保 ‘web_hook’ 资源类型已存在:

  1. $ ./bin/emqx_ctl resource-types list
  2. resource_type(name='web_hook', provider='emqx_web_hook', params=#{...}}, on_create={emqx_web_hook_actions,on_resource_create}, description='WebHook Resource')
  3. ...

2). 使用类型 ‘web_hook’ 创建一个新的资源,并配置 “url”=”http://127.0.0.1:9910 发送数据到 Web 服务 - 图4 (opens new window)“:

  1. $ ./bin/emqx_ctl resources create \
  2. 'web_hook' \
  3. -c '{"url": "http://127.0.0.1:9910", "headers": {"token":"axfw34y235wrq234t4ersgw4t"}, "method": "POST"}'
  4. Resource resource:691c29ba create

上面的 CLI 命令创建了一个 ID 为 ‘resource:691c29ba‘ 的资源,第一个参数是必选参数 - 资源类型(web_hook)。参数表明此资源指向 URL = “http://127.0.0.1:9910 发送数据到 Web 服务 - 图5 (opens new window)“ 的 Web 服务,方法为 POST,并且设置了一个 HTTP Header: “token”。

然后创建规则,并选择规则的动作为 ‘data_to_webserver’:

1). 列出当前所有可用的动作,确保 ‘data_to_webserver’ 动作已存在:

  1. $ ./bin/emqx_ctl rule-actions list
  2. action(name='data_to_webserver', app='emqx_web_hook', for='$any', types=[web_hook], params=#{'$resource' => ...}, title ='Data to Web Server', description='Forward Messages to Web Server')
  3. ...

2). 创建规则,选择 data_to_webserver 动作,并通过 “$resource” 参数将 resource:691c29ba 资源绑定到动作上:

  1. $ ./bin/emqx_ctl rules create \
  2. "SELECT username as u, payload FROM \"#\" where u='Steven'" \
  3. '[{"name":"data_to_webserver", "params": {"$resource": "resource:691c29ba"}}]' \
  4. -d "Forward publish msgs from steven to webserver"
  5. rule:26d84768

上面的 CLI 命令与第一个例子里创建 Inspect 规则时类似,区别在于这里需要把刚才创建的资源 ‘resource:691c29ba‘ 绑定到 ‘data_to_webserver’ 动作上。这个绑定通过给动作设置一个特殊的参数 ‘$resource’ 完成。’data_to_webserver’ 动作的作用是将数据发送到指定的 Web 服务器。

现在我们使用 username “Steven” 发送 “hello” 到任意主题,上面创建的规则就会被触发,Web Server收到消息并回复 200 OK:

  1. $ while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 9910; done;
  2. POST / HTTP/1.1
  3. content-type: application/json
  4. content-length: 32
  5. te:
  6. host: 127.0.0.1:9910
  7. connection: keep-alive
  8. token: axfw34y235wrq234t4ersgw4t
  9. {"payload":"hello","u":"Steven"}