Node.js:HTTP/REST 通过专有传输协议使用现有库的请求
Node.js: HTTP/REST requests using existing libraries over proprietary transport protocol
给定标准 Node.js HTTP 库或现有的 REST 客户端库,允许此类库在我自己的协议之上执行这些 HTTP 请求的最可行方法是什么?
换句话说:我的目标是提供一个看起来像HTTP客户端的模块。它接受 HTTP 请求 headers 和 returns HTTP 响应。我应该考虑哪些选项来调整现有的 REST 库以与我的 'pseudo' HTTP 客户端模块一起工作,而不是标准的 Node 库 HTTP 客户端?
更多背景信息
我想创建一个服务器应用程序(基于 Node.js),它向远程嵌入式设备发出 HTTP REST 请求。但是,由于 NAT,应用程序服务器无法直接与远程设备建立客户端 TCP 连接。因此,为了绕过 NAT,我将设计自己的专有协议,该协议涉及远程设备启动与应用程序服务器的持久连接。然后,一旦建立了持久连接,Node.js 应用程序将能够通过该持久连接向联网设备发出 HTTP 请求。
因此,我的 objective 是创建一个 Node.js 模块,它充当来自网络设备的传入套接字连接和发出 REST 请求的主应用程序之间的 'bridge' 层。目的是应用程序将发出 REST 请求,就像它向服务器发出 HTTP 客户端请求一样,而实际上 HTTP 请求和响应是在专有协议之上传送的。
我目前正在考虑的一个选项是让我的 'bridge' 模块实现一个模仿 http.request(options,[callback])
的接口,并以某种方式强制 REST 客户端库使用这个接口而不是 Node HTTP客户。据说至少我必须稍微修改我用来实现此目的的任何 REST 客户端库。
如上所述,我实际上是在尝试使用中间服务器创建我自己的 NAT 遍历形式。中间服务器会向用户提供 front-end UI,并向嵌入式网络设备发出 back-end 数据请求。嵌入式设备和应用程序服务器之间的连接将是持久的,并从嵌入式设备发起,以避免常见的 NAT 问题(即配置端口转发的要求)。
虽然我之前提到过我会通过原始套接字连接使用我自己的协议实现 device-to-server 连接,但我现在实际试验的机制是将普通 HTTP 与 long-polling.嵌入式设备启动与应用程序服务器的 HTTP 连接,并在服务器有内容要发送时使用延迟响应将数据传回设备。然后我会 'tunnel' HTTP 请求在上面的相反方向上。
因此,简单来说,我的 'bridge' 层是接受来自两侧(外部设备连接和内部 Web 应用程序 REST 请求)的 HTTP 连接的东西。通过使用 long-polling ,它将有效地在连接的客户端之间传递请求和响应。
创建一个中间人,而不是替换 http 层。在节点中创建一个 http 服务器,它是所有其余请求的目标。然后它将请求传输到专有协议并通过转换回 rest 来处理响应。
这样您就不必破解其余代码,甚至可以根据需要将其换成另一个库。
给定标准 Node.js HTTP 库或现有的 REST 客户端库,允许此类库在我自己的协议之上执行这些 HTTP 请求的最可行方法是什么?
换句话说:我的目标是提供一个看起来像HTTP客户端的模块。它接受 HTTP 请求 headers 和 returns HTTP 响应。我应该考虑哪些选项来调整现有的 REST 库以与我的 'pseudo' HTTP 客户端模块一起工作,而不是标准的 Node 库 HTTP 客户端?
更多背景信息
我想创建一个服务器应用程序(基于 Node.js),它向远程嵌入式设备发出 HTTP REST 请求。但是,由于 NAT,应用程序服务器无法直接与远程设备建立客户端 TCP 连接。因此,为了绕过 NAT,我将设计自己的专有协议,该协议涉及远程设备启动与应用程序服务器的持久连接。然后,一旦建立了持久连接,Node.js 应用程序将能够通过该持久连接向联网设备发出 HTTP 请求。
因此,我的 objective 是创建一个 Node.js 模块,它充当来自网络设备的传入套接字连接和发出 REST 请求的主应用程序之间的 'bridge' 层。目的是应用程序将发出 REST 请求,就像它向服务器发出 HTTP 客户端请求一样,而实际上 HTTP 请求和响应是在专有协议之上传送的。
我目前正在考虑的一个选项是让我的 'bridge' 模块实现一个模仿 http.request(options,[callback])
的接口,并以某种方式强制 REST 客户端库使用这个接口而不是 Node HTTP客户。据说至少我必须稍微修改我用来实现此目的的任何 REST 客户端库。
如上所述,我实际上是在尝试使用中间服务器创建我自己的 NAT 遍历形式。中间服务器会向用户提供 front-end UI,并向嵌入式网络设备发出 back-end 数据请求。嵌入式设备和应用程序服务器之间的连接将是持久的,并从嵌入式设备发起,以避免常见的 NAT 问题(即配置端口转发的要求)。
虽然我之前提到过我会通过原始套接字连接使用我自己的协议实现 device-to-server 连接,但我现在实际试验的机制是将普通 HTTP 与 long-polling.嵌入式设备启动与应用程序服务器的 HTTP 连接,并在服务器有内容要发送时使用延迟响应将数据传回设备。然后我会 'tunnel' HTTP 请求在上面的相反方向上。
因此,简单来说,我的 'bridge' 层是接受来自两侧(外部设备连接和内部 Web 应用程序 REST 请求)的 HTTP 连接的东西。通过使用 long-polling ,它将有效地在连接的客户端之间传递请求和响应。
创建一个中间人,而不是替换 http 层。在节点中创建一个 http 服务器,它是所有其余请求的目标。然后它将请求传输到专有协议并通过转换回 rest 来处理响应。
这样您就不必破解其余代码,甚至可以根据需要将其换成另一个库。