{"id":13651152,"url":"https://github.com/moleculerjs/moleculer-http-client","last_synced_at":"2025-04-22T22:30:33.444Z","repository":{"id":39916731,"uuid":"195546162","full_name":"moleculerjs/moleculer-http-client","owner":"moleculerjs","description":"HTTP client mixin that allows Moleculer services to communicate with remote REST APIs","archived":false,"fork":false,"pushed_at":"2023-06-19T18:26:09.000Z","size":866,"stargazers_count":18,"open_issues_count":3,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T13:14:49.007Z","etag":null,"topics":["http-client","http-request","moleculer"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moleculerjs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-07-06T14:06:39.000Z","updated_at":"2024-08-23T00:38:30.000Z","dependencies_parsed_at":"2023-02-08T09:46:21.882Z","dependency_job_id":"5b127918-59c3-48d2-9fbd-1ff0d21170fe","html_url":"https://github.com/moleculerjs/moleculer-http-client","commit_stats":{"total_commits":102,"total_committers":4,"mean_commits":25.5,"dds":0.05882352941176472,"last_synced_commit":"3c65ca67e1cc5385bf49b0b5ecea1de166dcd1fa"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moleculerjs%2Fmoleculer-http-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moleculerjs%2Fmoleculer-http-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moleculerjs%2Fmoleculer-http-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moleculerjs%2Fmoleculer-http-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moleculerjs","download_url":"https://codeload.github.com/moleculerjs/moleculer-http-client/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250333861,"owners_count":21413470,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http-client","http-request","moleculer"],"created_at":"2024-08-02T02:00:45.738Z","updated_at":"2025-04-22T22:30:33.018Z","avatar_url":"https://github.com/moleculerjs.png","language":"JavaScript","funding_links":[],"categories":["Services"],"sub_categories":["Others"],"readme":"![Moleculer logo](http://moleculer.services/images/banner.png)\n\n[![Build Status](https://travis-ci.org/moleculerjs/moleculer-http-client.svg?branch=master)](https://travis-ci.org/moleculerjs/moleculer-http-client) [![Coverage Status](https://coveralls.io/repos/github/moleculerjs/moleculer-http-client/badge.svg?branch=master)](https://coveralls.io/github/moleculerjs/moleculer-http-client?branch=master) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/moleculerjs/moleculer-http-client/master/LICENSE) [![npm](https://img.shields.io/npm/v/moleculer-http-client.svg)](https://www.npmjs.com/package/moleculer-http-client) [![Downloads](https://img.shields.io/npm/dm/moleculer-http-client.svg)](https://www.npmjs.com/package/moleculer-http-client)\n\n# moleculer-http-client\n\n\u003e **Warning** Current version uses got v11 which does not support node v18. [We need help migrate to got v12](https://github.com/moleculerjs/moleculer-http-client/issues/19)\n\nA tiny wrapper around [got](https://www.npmjs.com/package/got) HTTP client that allows [Moleculer](https://moleculer.services/) services to communicate with REST APIs. Why got? Because [reasons](https://github.com/sindresorhus/got#comparison).\n\n  - [Service Settings](#service-settings)\n  - [Service Actions](#service-actions)\n  - [Service Methods](#service-methods)\n  - [Usage](#usage)\n    - [Actions](#actions)\n    - [Events](#events)\n    - [Stream](#stream)\n    - [Cache](#cache)\n    - [Got Instance](#got-instance)\n  - [Customization](#customization)\n    - [Log Messages](#log-messages)\n    - [Errors](#errors)\n\n## Features\n\n- Make HTTP requests from Actions and Events\n- Stream data\n- Cache data\n- Customizable log messages and errors\n\n## Install\n```\nnpm install moleculer-http-client --save\n```\n\n## Service Settings\nUse `httpClient` field to configure your got client.\n\n```js\nmodule.exports = {\n  name: \"http\",\n  \n  /**\n   * Moleculer settings\n   */\n  settings: {\n    // HTTP client settings\n    httpClient: {\n      // Boolean value indicating whether request should be logged or not\n      logging: true,\n\n      // Log request function\n      logOutgoingRequest: logOutgoingRequest,\n\n      // Log response function\n      logIncomingResponse: logIncomingResponse,\n\n      // Format the Response      \n      responseFormatter: \"body\", // one of \"body\", \"headers\", \"status\", \"full\", \"raw\" or a Function. Example: (res) =\u003e ({body: res.body, headers: res.headers})\n\n      // Format the Errors\n      errorFormatter: errorFormatter,\n\n      // Got Client options\n      defaultOptions: {\n        // Put here any Got available option that can be used to extend Got client\n      }\n    }\n  },\n};\n```\n\n## Service Actions\n\n## `get`\nHTTP GET action\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n\n### Returns\n**Type:** `Promise`, `Stream`\n\n## `post` \n\nHTTP POST action\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n\u003e **Note:** When streaming use `ctx.meta` to pass `url` and `opt` and `ctx.params` to pass stream data\n\n### Returns\n**Type:** `Promise`\n\n## `put` \n\nHTTP PUT action\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n\u003e **Note:** When streaming use `ctx.meta` to pass `url` and `opt` and `ctx.params` to pass stream data\n\n### Returns\n**Type:** `Promise`\n\n## `patch` \n\nHTTP PATCH action\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n\u003e **Note:** When streaming use `ctx.meta` to pass `url` and `opt` and `ctx.params` to pass stream data\n\n### Returns\n**Type:** `Promise`\n\n## `delete` \n\nHTTP DELETE action\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n\u003e **Note:** When streaming use `ctx.meta` to pass `url` and `opt` and `ctx.params` to pass stream data\n\n### Returns\n**Type:** `Promise`\n\n## Service Methods\n## `_get` \n\nHTTP GET method\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n\n### Returns\n**Type:** `Promise`, `Stream`\n\n## `_post` \n\nHTTP POST method\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n### Returns\n**Type:** `Promise`\n\n\n## `_put` \n\nHTTP PUT method\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n### Returns\n**Type:** `Promise`\n\n\n## `_patch` \n\nHTTP PATCH method\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n| `streamPayload` | `Stream`| **optional** | Stream payload |\n\n### Returns\n**Type:** `Promise`\n\n## `_delete` \n\nHTTP DELETE method\n\n### Parameters\n| Property | Type | Default | Description |\n| -------- | ---- | ------- | ----------- |\n| `url` | `String`| **required** | URL |\n| `opt` | `Object`| **optional** | [Request options](https://www.npmjs.com/package/got#options) |\n\n### Returns\n**Type:** `Promise`\n\n# Usage\n## Actions\n**Action Example**\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\n\n// Create broker\nlet broker = new ServiceBroker();\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service  \n  mixins: [HTTPClientService]\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Make a HTTP GET request\n    .call(\"http.get\", {\n      url: \"https://httpbin.org/json\",\n      opt: { responseType: \"json\" }\n    })\n    .then(res =\u003e broker.logger.info(res))\n    .catch(error =\u003e broker.logger.error(error));\n});\n```\n\n**Result**\n```bash\nINFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/json\"\nINFO  http-client/HTTP: \u003c= HTTP GET to \"https://httpbin.org/json\" returned with status code 200\nINFO  http-client/BROKER: { slideshow: { author: 'Yours Truly', date: 'date of publication', slides: [ [Object], [Object] ], title: 'Sample Slide Show' } }\n```\n\n## Events\n**Event Example**\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\n\n// Create broker\nlet broker = new ServiceBroker();\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService],\n\n  events: {\n    // Register an event listener\n    async \"some.Event\"(request) {\n      this.logger.info(\"Caught an Event\");\n      // Use service method to make a request\n      const res = await this._get(request.url, request.opt);\n      this.logger.info(\"Printing Payload\");\n      // Print the response data\n      this.logger.info(res.body);\n    }\n  }\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Emit some event\n    .emit(\"some.Event\", {\n      url: \"https://httpbin.org/json\",\n      opt: { responseType: \"json\" }\n    });\n});\n```\n\n**Result**\n```bash\nINFO  http-client/HTTP: Caught an Event\nINFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/json\"\nINFO  http-client/HTTP: \u003c= HTTP GET to \"https://httpbin.org/json\" returned with status code 200\nINFO  http-client/HTTP: Printing Payload\nINFO  http-client/HTTP: { slideshow: { author: 'Yours Truly', date: 'date of publication', slides: [ [Object], [Object] ], title: 'Sample Slide Show' } }\n```\n\n## Stream\n### GET Stream\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\nconst fs = require(\"fs\");\n\n// Create broker\nlet broker = new ServiceBroker({\n  nodeID: \"http-client\"\n});\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService]\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Make a HTTP GET request\n    .call(\"http.get\", {\n      url: \"https://sindresorhus.com/\",\n      opt: { isStream: true }\n    })\n    .then(res =\u003e {\n      const filePath = \"./examples/stream-get/file.md\";\n      res.pipe(fs.createWriteStream(filePath, { encoding: \"utf8\" }));\n\n      res.on(\"response\", response =\u003e {\n        broker.logger.info(response.statusCode);\n      });\n    })\n    .catch(error =\u003e broker.logger.error(error));\n});\n```\n\n### POST Stream\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\nconst ApiGateway = require(\"moleculer-web\");\nconst fs = require(\"fs\");\n\n// Create broker\nlet broker = new ServiceBroker({\n  nodeID: \"http-client\"\n});\n\n// Create a HTTP Client Service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService]\n});\n\n// Create HTTP Server Services\nbroker.createService({\n  name: \"api\",\n  mixins: [ApiGateway],\n  settings: {\n    port: 4000,\n    routes: [\n      {\n        path: \"/stream\",\n        bodyParsers: { json: false, urlencoded: false },\n        aliases: { \"POST /\": \"stream:api.postStream\" }\n      }\n    ]\n  },\n\n  actions: {\n    postStream(ctx) {\n      return new Promise((resolve, reject) =\u003e {\n        const stream = fs.createWriteStream(\n          \"./examples/stream-post/stored-data.md\"\n        );\n\n        stream.on(\"close\", async () =\u003e {\n          resolve({ fileName: `file.md`, method: \"POST\" });\n        });\n\n        // Return error to the user\n        stream.on(\"error\", err =\u003e {\n          reject(err);\n        });\n\n        // Pipe the data\n        ctx.params.pipe(stream);\n      });\n    }\n  }\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  const streamFile = \"./examples/stream-post/data-to-stream.md\";\n  const stream = fs.createReadStream(streamFile, { encoding: \"utf8\" });\n\n  // Pass stream as ctx.params\n  // Pass URL and options in ctx.meta\n  const req = broker.call(\"http.post\", stream, {\n    meta: { url: \"http://127.0.0.1:4000/stream\", isStream: true }\n  });\n\n  req.then(res =\u003e {\n    broker.logger.info(res.statusCode);\n  });\n});\n```\n\n## Cache\n### Moleculer Cache\nIf you are using [actions](#service-actions) to make HTTP requests then you can use [Moleculer's cache](https://moleculer.services/docs/0.13/caching.html) to cache responses.\n\n\u003e Please note that when using Moleculer's cache you will be ignoring [`Cache-Control` header field](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control). If you care about `Cache-Control` then you should use [Got's cache](#gots-cache).\n\n\n**Example of Moleculer Cache**\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\n\n// Create broker\nlet broker = new ServiceBroker({\n  nodeID: \"http-client\",\n  // Enable Moleculer Cache\n  cacher: \"Memory\"\n});\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService],\n\n  actions: {\n    get: {\n      // Enable cache for GET action\n      // More info: https://moleculer.services/docs/0.13/caching.html\n      cache: true\n    }\n  }\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Make a HTTP GET request\n    .call(\"http.get\", {\n      url: \"https://httpbin.org/json\",\n      opt: { responseType: \"json\" }\n    })\n    .then(res =\u003e broker.logger.info(res.body))\n    .then(() =\u003e\n      broker.call(\"http.get\", {\n        url: \"https://httpbin.org/json\",\n        opt: { responseType: \"json\" }\n      })\n    )\n    .then(res =\u003e broker.logger.info(res.body))\n    .catch(error =\u003e broker.logger.error(error));\n});\n```\n**Result**\n```bash\n            INFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/json\"\n            INFO  http-client/HTTP: \u003c= HTTP GET to \"https://httpbin.org/json\" returned with status code 200\nRequest -\u003e  INFO  http-client/BROKER: { slideshow: { author: 'Yours Truly', date: 'date of publication', slides: [ [Object], [Object] ], title: 'Sample Slide Show' } }\nCache   -\u003e  INFO  http-client/BROKER: { slideshow: { author: 'Yours Truly', date: 'date of publication', slides: [ [Object], [Object] ], title: 'Sample Slide Show' } }\n```\n\n### Got's Cache\nIf you are using [methods](#service-methods) or you care about `Cache-Control` header option then you should use [Got's cache](https://www.npmjs.com/package/got#cache-1).\n\n**Example of Got cache**\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\n\n// Using JS Map as cache\nconst cacheMap = new Map();\n\n// Create broker\nlet broker = new ServiceBroker({\n  nodeID: \"http-client\"\n});\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService],\n\n  settings: {\n    httpClient: {\n      defaultOptions: {\n        // Set Got's built-in cache\n        // More info: https://www.npmjs.com/package/got#cache-1\n        cache: cacheMap\n      }\n    }\n  }\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Make a HTTP GET request\n    .call(\"http.get\", {\n      url: \"https://httpbin.org/cache/150\",\n      opt: { responseType: \"json\" }\n    })\n    .then(res =\u003e broker.logger.info(res.isFromCache))\n    .then(() =\u003e\n      broker.call(\"http.get\", {\n        url: \"https://httpbin.org/cache/150\",\n        opt: { responseType: \"json\" }\n      })\n    )\n    .then(res =\u003e broker.logger.info(res.isFromCache))\n    .catch(error =\u003e broker.logger.error(error));\n});\n```\n\n**Result**\n```bash\nINFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/cache/150\"\nINFO  http-client/HTTP: \u003c= HTTP GET to \"https://httpbin.org/cache/150\" returned with status code 200\nINFO  http-client/BROKER: false\nINFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/cache/150\"\nINFO  http-client/HTTP: **CACHED** HTTP GET to \"https://httpbin.org/cache/150\" returned with status code 200\nINFO  http-client/BROKER: true\n```\n\n### Got Instance\nIf you need to do some fancy request (e.g., `HEAD`, `TRACE`, `OPTIONS`) you can directly call the got client available at `_client`.\n\n```js\nconst { ServiceBroker } = require(\"moleculer\");\nconst HTTPClientService = require(\"moleculer-http-client\");\n\n// Create broker\nlet broker = new ServiceBroker({\n  nodeID: \"http-client\"\n});\n\n// Create a service\nbroker.createService({\n  name: \"http\",\n\n  // Load HTTP Client Service\n  mixins: [HTTPClientService],\n\n  actions: {\n    async fancyRequest(ctx) {\n      try {\n        // Direct call to Got Client\n        // Can be any Got supported HTTP Method\n        return await this._client(ctx.params.url, ctx.params.opt);\n      } catch (error) {\n        throw error;\n      }\n    }\n  }\n});\n\n// Start the broker\nbroker.start().then(() =\u003e {\n  broker\n    // Make a fancy request\n    .call(\"http.fancyRequest\", {\n      url: \"https://httpbin.org/json\",\n      opt: { method: \"GET\", responseType: \"json\" }\n    })\n    .then(res =\u003e broker.logger.info(res.body))\n    .catch(error =\u003e broker.logger.error(error));\n});\n```\n\n```bash\nINFO  http-client/HTTP: =\u003e HTTP GET to \"https://httpbin.org/json\"\nINFO  http-client/HTTP: \u003c= HTTP GET to \"https://httpbin.org/json\" returned with status code 200\nINFO  http-client/BROKER: { slideshow: { author: 'Yours Truly', date: 'date of publication', slides: [ [Object], [Object] ], title: 'Sample Slide Show' } }\n```\n\n## Customization\n### Log Messages\n```js\n    const service = broker.createService({\n      name: \"http\",\n\n      mixins: [MoleculerHTTP],\n\n      settings: {\n        httpClient: {\n          // Input is Got's options object. More info: https://www.npmjs.com/package/got#options\n          logOutgoingRequest: options =\u003e {\n            console.log(`-----\u003e Request ${options.href}`);\n          },\n\n          // Input is Got's response object: More info: https://www.npmjs.com/package/got#response\n          logIncomingResponse: response =\u003e {\n            console.log(`\u003c----- Response Status Code ${response.statusCode}`);\n          }\n        }\n      }\n    });\n```\n\n### Errors\n```js\n    const service = broker.createService({\n      name: \"http\",\n\n      mixins: [MoleculerHTTP],\n\n      settings: {\n        httpClient: {\n          // Custom error handler function\n          // Input error is Got's error. More info: https://www.npmjs.com/package/got#errors\n          errorFormatter: error =\u003e {\n            return new Error(\"Custom Error\");\n          }\n        }\n      }\n    });\n```\n\n## Test\n```bash\n$ npm test\n```\n\n# Contribution\n\nPlease send pull requests improving the usage and fixing bugs, improving documentation and providing better examples.\n\n# License\nThe project is available under the [MIT license](https://tldrlegal.com/license/mit-license).\n\n# Contact\nCopyright (c) 2016-2020 MoleculerJS\n\n[![@moleculerjs](https://img.shields.io/badge/github-moleculerjs-green.svg)](https://github.com/moleculerjs) [![@MoleculerJS](https://img.shields.io/badge/twitter-MoleculerJS-blue.svg)](https://twitter.com/MoleculerJS) \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoleculerjs%2Fmoleculer-http-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoleculerjs%2Fmoleculer-http-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoleculerjs%2Fmoleculer-http-client/lists"}