如何在 React/Webpack 中创建代理来调用外部 API

IT技术 reactjs webpack proxy create-react-app
2021-03-26 04:19:37

我想向我无法控制的外部 API 发出 GET 请求。由于 API 的安全性,我的 React 应用程序无法直接向端点发出 ajax 请求。因此,我想创建一个简单的代理作为证明这里

我的package.json file看起来像这样:

{
  "name": "my-stack",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^15.6.1",
    "react-dom": "^15.6.1",
    "react-router-dom": "^4.2.2",
    "react-scripts": "1.0.13"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "proxy": {
    "https://gold-feed.com/paid/*": {
        "target": "https://gold-feed.com/paid",
        "changeOrigin": true
    }
  }
}

然后我的 ajax 请求如下所示:

const apiUrl = 'https://gold-feed.com/paid/<apiID>/all_metals_json_usd.php';

jQuery.ajax({
  method: 'GET',
  url: apiUrl,
  success: (item) => {
    this.props.addItem(item);
  }
});

但它似乎没有做任何事情。我仍然收到以下错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.

我基本上遇到了与此处记录的问题相同的问题,他试图创建代理以访问 Steam api。

顺便说一句,我相信我正在使用的 create-react-app 项目是在 webpack 的捎带。

3个回答

你现在可能已经想通了,但对于其他人来说,这里对我有用:

"proxy": {
    "/proxy": {
        "target": "https://mybackend.com",
        "pathRewrite": {
                "^/proxy" : ""
        },
        "changeOrigin": true
    }
}

所以myreact.com/proxy/my/path被重定向到mybackend.com/my/path

我认为您的情况的错误在于您将目标作为代理的键而不是react服务器上的路径。

嗨,我已经尝试了一天了,但它似乎根本不起作用。使用 create-react-app 但我们已经弹出。在包 json 中添加代理对象,应用服务器路径端点匹配,外部服务作为目标命中。该应用程序仍然试图点击不存在的本地路线......也许我错过了一个没有在任何地方清楚记录的步骤?或者,过去我使用带有 http-proxy 的 express 应用程序来解决这些 CORS 问题,这非常简单。
2021-06-20 04:19:37

对于我的情况,我的 api 部署在 AWS 上,我发现该设置

"changeOrigin": true

是必要的(chrome 和 edge 工作正常,firefox (62.0.3) 抱怨“无效的 CORS 请求”)。

在 webpack http 代理的文档中,他们说这个选项:(https://github.com/chimurai/http-proxy-middleware

提示:对于基于名称的虚拟托管站点,将选项 changeOrigin 设置为 true。

笔记:

  • 在同一台机器上本地运行 api 不需要火狐。
  • firefox 添加了标题“来源”,当我删除并重新发送请求时,该标题有效。
  • 添加“changeOrigin”没有副作用,所以我将从现在开始这样做。

我不确定这是 Firefox 中的错误还是什么,无论如何我的最终配置是:

"proxy": {
  "/api": {
    "target": "<put ip address>",
    "changeOrigin" : true
  }
}

您应该将 /api 替换为您的 api 路径或将路径重写为上面的答案。

您可以将外部 API 代理到本地主机,更改前端源(本地主机:3000),目标服务器,如果需要更新令牌并在节点 js 中运行以下脚本

const express = require('express');
const proxy = require('express-http-proxy');
const cors = require("cors");

const app = express();

app.use(
  cors({
    origin: 'localhost:3000',
    credentials: false
  })
);

app.use('/', proxy('https://www.targetserver.com/', {
  proxyReqPathResolver: function (req) {
    return req.url;
  },
  proxyReqOptDecorator: function (proxyReqOpts, srcReq) {
    proxyReqOpts.headers = {'Authorization': 'Replace with JWT'};
    return proxyReqOpts;
  }
}))

app.get('/*',function(req,res,next){
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});


app.listen(4000, () => console.log(`Server Listening on port ${4000}!`));

像这样在你的 fontend 应用程序中使用它(使用 axios 或 fetch):

axios.get('http://localhost:4000/api/route).then(x => console.log(x));