Webpack 配置以使用没有 CORS 标头的 API

Posted

技术标签:

【中文标题】Webpack 配置以使用没有 CORS 标头的 API【英文标题】:Webpack config to consume an API with no CORS header 【发布时间】:2018-08-10 03:16:14 【问题描述】:

我需要使用一个没有 CORS 标头的公共 API。我是 webpack 的新手,所以我通过阅读文章来采用这种方法。脚手架由公司提供。这是工作练习的第二部分。

我一直在寻找几个小时,但似乎没有任何帮助。我总是得到相同的回复No 'Access-Control-Allow-Origin' header is present on the requested resource ...

这是我现在的webpack.config.js

const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');

const HtmlWebpackPluginConfig = new HtmlWebpackPlugin(
  template: './client/index.html',
  filename: 'index.html',
  inject: 'body'
)
module.exports = 
  entry: './client/index.js',
  output: 
    path: path.resolve('dist'),
    filename: 'index_bundle.js'
  ,
  module: 
    rules: [
       test: /\.js$/,
        exclude: /node_modules/,
        use: ['babel-loader'],
      ,
       test: /\.jsx$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      ,
      
        test: /\.(sass)$/,
        use: [
            loader: "style-loader"
          , 
            loader: "css-loader"
          , 
            loader: "sass-loader"
        ]
      ,
      
        test: /\.html/,
        loader: 'raw-loader'
      ,
    ],
  ,
  plugins: [HtmlWebpackPluginConfig],
  devServer: 
    contentBase: './src/public',
    port: 1184,
    proxy: 
      'https://api.mcmakler.de/v1/advertisements': 
        target: 'https://api.mcmakler.de/v1/advertisements',
        secure: false
      
    
  ,
  resolve: 
    extensions: [ '.js', '.jsx' ]
  
;

我的依赖是:

 "devDependencies": 
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.9",
    "eslint": "^4.0.0",
    "file-loader": "^1.1.8",
    "html-webpack-plugin": "^2.28.0",
    "node-sass": "^4.7.2",
    "raw-loader": "^0.5.1",
    "sass-loader": "^6.0.6",
    "style-loader": "^0.20.2",
    "url-loader": "^0.6.2",
    "webpack": "^2.6.1",
    "webpack-dev-server": "^2.4.5"
  ,
  "dependencies": 
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "yarn": "^1.3.2"
  

这是我的 jsx 文件,它是一个用于渲染广告的简单组件

import React from 'react';

import House from './index.jsx';

const publicApi = "https://api.mcmakler.de/v1/advertisements";

export default class Dinamic extends React.Component 
    constructor () 
        super();
        this.state = 
            advertisements: [],
        ;
    
    componentDidMount() 

        fetch(publicApi)
        .then((results) => 
                console.info('results: ', results);
                return results.blob();
            )
            .then ((data) => 
                console.info('data: ', data);
                const advertisements = data.results.map((ad) => 
                    return (
                        <div key="ads.results" >
                            <p>ad.title</p>
                        </div>
                    )
                );
                this.setState( advertisements );
            )
            .catch((err) => 
                console.error("boom!: ", err);
            )
    
  render() 
    return (
      <div className="container-fluid">
        <div className="container">
            <h1>Dinamic</h1>
          <div className="row">
                        this.state.advertisements
          </div>
        </div>
      </div>
    );
  

我错过了什么重要的东西还是完全错了?

免责声明:这份工作是为 Web UI 开发人员准备的,但我认为这也很有趣

【问题讨论】:

尝试不使用cors。 fetch(url, mode: 'no-cors' )developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch 这给了我一个不透明的响应,没用 【参考方案1】:

浏览器不允许从响应中读取禁止的标头,例如“set-cookie”,浏览器也不允许设置“Cookie”标头。所以我通过在 onProxyRes 方法中读取 cookie 并将其保存在一个变量中并在 onProxyReq 方法中的以下请求中设置保存的 cookie 来解决这个问题。

let cookie;
devConfig.devServer =   
  proxy: 
    '*': 
      target: https://target.com,
      secure: false, 
      changeOrigin: true, 
      onProxyReq: (proxyReq) => 
        proxyReq.setHeader('Cookie', cookie);
      ,
      onProxyRes: (proxyRes) => 
        Object.keys(proxyRes.headers).forEach((key) => 
          if (key === 'set-cookie' && proxyRes.headers[key]) 
            const cookieTokens = split(proxyRes.headers[key], ',');
            cookie = cookieTokens.filter(element => element.includes('JSESSIONID')).join('');
          
        );
      ,
    ,
  ,

【讨论】:

以上是关于Webpack 配置以使用没有 CORS 标头的 API的主要内容,如果未能解决你的问题,请参考以下文章

如何在webpack中使用跨域

如何测试CORS头

没有 S3 存储桶的 AWS Cloudfront CORS 标头

如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?

用于 CORS 请求的 webpack-dev-server 配置

.NET CORE 2.1 中的 CORS - 简单配置不返回标头