Python から HTTP POST リクエストで Node-RED と連携するメモ

Python から HTTP POST リクエストで Node-RED と連携するメモです。

RhinocerosとGrasshopperでPythonを使ったり、IoTやRaspberry PiでPythonから動かすケースもあり、たまにトライすると忘れがちになっているのでまとめておきます。

Node-RED の実装

image

HTTP POST リクエストで /test のURLで受け取れるものを作ります。

[{"id":"34a1212d.88421e","type":"http in","z":"69563815.d6c028","name":"","url":"/test","method":"post","upload":false,"swaggerDoc":"","x":140,"y":100,"wires":[["e90ad6cd.8d2238","10ea814.621f77f"]]},{"id":"65d2707.499e09","type":"http response","z":"69563815.d6c028","name":"","statusCode":"","headers":{},"x":570,"y":100,"wires":[]},{"id":"e90ad6cd.8d2238","type":"change","z":"69563815.d6c028","name":"応答 {\"result\":\"OK\"}","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"result\":\"OK\"}","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":370,"y":100,"wires":[["65d2707.499e09"]]},{"id":"10ea814.621f77f","type":"debug","z":"69563815.d6c028","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":350,"y":140,"wires":[]}]

インポートできる フローの JSON データです。

Python のコード

Python はバージョン2で書いています。import rhinoscriptsyntax as rs のような、Rhinoceros と Grasshopper で Python を動かすようなコードは除外しています。素の Python のものです。

ファイル名で get-http.pyにしています。

# coding: UTF-8

import urllib2
import json

params = {}

### JSON データ設定
# https://docs.python.org/ja/3/library/json.html

# Dictionary(object)
params["x"] = 10
params["y"] = -10
params["z"] = 5

# Array
params["arr"] = []
params["arr"].append(["id1","A"]) # append Array
params["arr"].append(["id2","B"]) # append Array
params["arr"].append({"id3":"C"}) # append Object
params["arr"].append({"id4":"D"}) # append Object

### HTTP リクエスト設定
# python3 https://docs.python.org/ja/3/library/urllib.request.html
# python2 https://docs.python.org/ja/2.7/library/urllib2.html

# JSON データを文字列化
data = json.dumps(params)
# print(data)

# Content-Type application/json を HTTP Header に加える
url = 'http://localhost:1880/test'
request = urllib2.Request(url)
request.add_header('Content-Type','application/json')

# POST リクエスト
response = urllib2.urlopen(request,data)

### HTTP レスポンス
print('code',response.getcode())
# 結果 : ('code', 200)

# 返答データを抽出
response_data = response.read()
print('response_data',response_data)
# 結果 : ('response_data', '{"result":"OK"}')

# さらに返答データを JSON として取り出す
response_json = json.loads(response_data)
print('response_json["result"]',response_json["result"])
# 結果 : ('response_json["result"]', u'OK')

http://localhost:1880/test については、Node-REDで置かれているURLに合わせて設定してください。もちろん、ローカルホスト localhost 127.0.01 もいけますし、どこかのドメインやローカルネットワーク上の IP アドレスにアクセスできます。

連携してみる

python get-http.py

上記の Python を手元で実行してみます。

image

Node-REDのほうで、ちゃんと Object や Array が解釈されて受信できています!