通过 SSH 隧道访问端点
Posted
技术标签:
【中文标题】通过 SSH 隧道访问端点【英文标题】:Accessing endpoint via SSH tunnel 【发布时间】:2020-01-28 05:24:57 【问题描述】:我正在我的本地机器 (localhost) 上运行一个开发项目,它试图通过 SSH 隧道(React JS SPA)从服务器上的端点加载数据。
SSH 隧道建立良好,端点在 Postman 中使用简单的 GET 运行时返回正确的数据包。
但是当我尝试从我的应用程序访问数据时(尝试获取和 Axios)返回 200,但不幸的是总是返回一个空数组 - 而不是 1k 对象数组。
以下是 2 个简单的请求,其中 'localhost:8912' 是暴露和映射的端口 - 在 Postman 中有效。
获取:
fetch("http://localhost:8912/ENDPOINT/")
.then(res => console.log(res))
.catch(err =>
console.log(err);
return null;
);
Axios:
axios
.get("http://localhost:8912/ENDPOINT/")
.then(data => console.log(data.data))
.catch(err =>
console.log(err);
return null;
);
结果几乎立即在浏览器中返回,但由于服务器端计算,在 Postman 中需要几秒钟。
欢迎提出任何建议。
【问题讨论】:
你的隧道必须隧道到 api,而不是前端应用程序 隧道未连接到前端应用程序,它已连接到 api,api 映射到该 localhost 端口并且在浏览器之外工作正常 - 即我可以达到所有端点从我的本地机器从 Postman 等内部和 api 在浏览器中返回 200,只是没有任何数据包 - 就好像 Promise 在返回数据之前完成 - 在浏览器之外不是这种情况。 将localhost
替换为127.0.0.1
会发生什么?
【参考方案1】:
尝试将 localhost
替换为 127.0.0.1
这可能与浏览器与 Postman 中的地址解析有关。
【讨论】:
我不敢相信这真的奏效了——有时这很简单。谢谢@janniks【参考方案2】:如果您没有代理,您可以将 axios 与另一个 npm 库结合使用 — tunnel 以建立 HTTPS-over-HTTP 隧道:
import axios, AxiosInstance from 'axios';
import * as tunnel from 'tunnel';
const agent = tunnel.httpsOverHttp(
proxy:
host: 'proxy.mycorp.com',
port: 8000,
,
);
const axiosClient: AxiosInstance = axios.create(
baseURL: 'https://some.api.com:443', // here I specify port 443
httpsAgent: agent,
);
参考:https://janmolak.com/node-js-axios-behind-corporate-proxies-8b17a6f31f9d
【讨论】:
【参考方案3】:fetch("http://localhost:8912/ENDPOINT/")
.then(res => return res.json())
.then(res => console.log(res))
.catch(err =>
console.log(err);
return null;
);
fetch 返回一个对象作为 Promise,其中包含各种信息,如标头、HTTP 状态等。
你有 res.json() 和其他各种可能性。 .json() 只会将正文作为带有 json 内容的承诺返回。
欲了解更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
您可以按如下方式返回数据:
.arrayBuffer() .blob() .json() .text() .formData()【讨论】:
以上是关于通过 SSH 隧道访问端点的主要内容,如果未能解决你的问题,请参考以下文章