Статьи

Составление API с Node-RED и JavaScript

Как говорится на сайте Node-RED, «Node-RED — это инструмент для соединения аппаратных устройств, API-интерфейсов и онлайн-сервисов новыми и интересными способами». Уже довольно давно можно использовать Node-RED для сценариев Интернета вещей в Bluemix . С новой службой Connect and Compose (beta) теперь вы также можете использовать Node-RED для создания сложных API-интерфейсов через редактор потоков и JavaScript.

Ниже приведен простой пример того же сценария, который я реализовал с помощью службы управления API . Чтобы уменьшить количество запросов от (мобильных) клиентов, перед отправкой результатов клиенту вызываются два HTTP-запроса.

После создания экземпляра службы в Bluemix вы можете создавать новые API. В редакторе Node-RED первое, что вам нужно, это узел Http In, где вы определяете тип запроса и URL. Узел Http In связан с узлом Swagger-Doc, где определены входные и выходные параметры. Чтобы открыть редактор Swagger-Doc, нажмите «Редактировать» в узле HTTP In.

composeapi2

Последним узлом потока должен быть узел Http Response, который возвращает данные в переменной msg.payload, как определено в узле Swagger-Doc. Все остальное между узлом Http In (со связанным узлом Swagger-Doc) и узлом Http Response зависит от вас. В моем простом примере я просто вызываю два запроса Http get и объединяю ответы в одном сообщении.

composeapi1

Вот определение потока. Я использую несколько узлов Function, которые содержат код JavaScript. В некоторых местах представлена ​​нижележащая реализация Node.js. Например, msg.req.query можно использовать для чтения параметра «имя» во входящем URL-запросе REST, который является функцией объекта запроса в Express , веб-инфраструктуре Node.js, используемой в Node-RED.

[{
"id": "44eb9c6d.bb1464",
"type": "swagger-doc",
"summary": "Hello World",
"description": "Hello World",
"tags": "",
"consumes": "application/json",
"produces": "application/json",
"parameters": [{
"name": "name",
"in": "query",
"description": "name",
"required": false,
"type": "string"
}],
"responses": {
"200": {
"description": "Success",
"schema": {
"properties": {
"java": {
"type": "string"
},
"node": {
"type": "string"
}
}
}
}
},
"deprecated": false
}, {
"id": "72b8b258.8d474c",
"type": "http in",
"name": "",
"url": "/hello",
"method": "post",
"swaggerDoc": "44eb9c6d.bb1464",
"x": 123.51248168945312,
"y": 59,
"z": "f4c8dbcb.0b3728",
"wires": [
["ca6abb2d.359548"]
]
}, {
"id": "5a5ae0c8.a5a52",
"type": "http response",
"name": "",
"x": 570.0124664306641,
"y": 325.1166687011719,
"z": "f4c8dbcb.0b3728",
"wires": []
}, {
"id": "1a4d6a88.e5b295",
"type": "http request",
"name": "Node API",
"method": "GET",
"ret": "txt",
"url": "",
"x": 340.8957977294922,
"y": 147.88888549804688,
"z": "f4c8dbcb.0b3728",
"wires": [
["a78a3c45.5875c"]
]
}, {
"id": "679c7fa2.98638",
"type": "debug",
"name": "",
"active": true,
"console": "false",
"complete": "false",
"x": 584.8957366943359,
"y": 382.888916015625,
"z": "f4c8dbcb.0b3728",
"wires": []
}, {
"id": "ca6abb2d.359548",
"type": "function",
"name": "Setup Node",
"func": "msg.url = 'http://node-swagger-docker-hello-world.mybluemix.net/hello?name=' + msg.req.query.name;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 181.89581298828125,
"y": 147.88888549804688,
"z": "f4c8dbcb.0b3728",
"wires": [
["1a4d6a88.e5b295"]
]
}, {
"id": "b520f29b.4adf1",
"type": "function",
"name": "Setup Java",
"func": "msg.url = 'http://gs-rest-service-cg.mybluemix.net/greeting?name=' + msg.req.query.name;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 180.89581298828125,
"y": 237.88888549804688,
"z": "f4c8dbcb.0b3728",
"wires": [
["afea2918.5015d8"]
]
}, {
"id": "afea2918.5015d8",
"type": "http request",
"name": "Java API",
"method": "GET",
"ret": "txt",
"url": "",
"x": 337.8957977294922,
"y": 237.88888549804688,
"z": "f4c8dbcb.0b3728",
"wires": [
["f794a650.086b58"]
]
}, {
"id": "a78a3c45.5875c",
"type": "function",
"name": "Store Node",
"func": "msg.nodemessage = JSON.parse(msg.payload);\nmsg.node = msg.nodemessage.message;\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"x": 508.8697967529297,
"y": 148.36109924316406,
"z": "f4c8dbcb.0b3728",
"wires": [
["b520f29b.4adf1"]
]
}, {
"id": "79819a90.867e64",
"type": "function",
"name": "Response",
"func": "msg.payload = {\n    java: msg.java,\n    node: msg.node\n}\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 357.01246643066406,
"y": 356.1166687011719,
"z": "f4c8dbcb.0b3728",
"wires": [
["5a5ae0c8.a5a52", "679c7fa2.98638"]
]
}, {
"id": "f794a650.086b58",
"type": "function",
"name": "Store Java",
"func": "msg.javamessage = JSON.parse(msg.payload);\nmsg.java = msg.javamessage.content;\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"x": 501.89576721191406,
"y": 237.88888549804688,
"z": "f4c8dbcb.0b3728",
"wires": [
["79819a90.867e64"]
]
}]

После того как вы создали API, служба Connect and Compose предоставляет определение API Swagger и проводник API. Чтобы позволить только определенным приложениям вызывать API, предоставляются ключи приложений и секреты.

composeapi3

Чтобы узнать больше, ознакомьтесь с документацией Connect and Compose и образцом рассылки по электронной почте .