zoukankan      html  css  js  c++  java
  • Fetch请求

    get请求

    App.js

    import React from 'react';
    
    import ProxyDemo from './ProxyDemo';
    
    export default class App extends React.Component {
    	constructor(props) {
    		super(props);
    		this.state = {
    			banners: [],
    		};
    	}
    
    	componentDidMount() {
    		/**
    		 * fetch 基于promise
    		 * https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
    		 */
    
    		fetch('http://iwenwiki.com/api/blueberrypai/getIndexBanner.php')
    			.then((res) => res.json())
    			.then((data) => {
    				this.setState({
    					banners: data.banner,
    				});
    				console.log(data.banner);
    			});
    	}
    
    	render() {
    		const { banners } = this.state;
    		return (
    			<div>
    				<ProxyDemo></ProxyDemo>
    				{banners.length > 0 ? (
    					<ul>
    						{banners.map((element, index) => {
    							return <li key={index}> {element.title} </li>;
    						})}
    					</ul>
    				) : (
    					<div>等待数据加载</div>
    				)}
    			</div>
    		);
    	}
    }
    

    POST请求

    import React from 'react';
    
    import ProxyDemo from './ProxyDemo';
    import qs from 'querystring';
    
    export default class App extends React.Component {
    	constructor(props) {
    		super(props);
    		this.state = {
    			banners: [],
    		};
    	}
    
    	componentDidMount() {
    		/**
    		 * fetch 基于promise
    		 * https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
    		 */
    
    		fetch('http://iwenwiki.com/api/blueberrypai/getIndexBanner.php')
    			.then((res) => res.json())
    			.then((data) => {
    				this.setState({
    					banners: data.banner,
    				});
    				console.log(data.banner);
    			});
    
    		fetch('http://iwenwiki.com/api/blueberrypai/login.php', {
    			method: 'POST',
    			headers: {
    				'Content-Type': 'application/x-www-form-urlencoded',
    				Accept: 'application/json, text/plain,*/*',
    			},
    			// body: {
    			// 	user_id: 'iwen@qq.com',
    			// 	password: 'iwen123',
    			// 	verification_code: 'crfvw',
    			// },
    			// 方法一:
    			// body:
    			// 	'user_id=iwen@qq.com&password=iwen123&verification_code=crfvw',
    			// 方法二:
    			body: qs.stringify({
    				user_id: 'iwen@qq.com',
    				password: 'iwen123',
    				verification_code: 'crfvw',
    			}),
    		})
    			.then((res) => res.json())
    			.then((data) => {
    				console.log(data);
    			});
    	}
    
    	render() {
    		const { banners } = this.state;
    		return (
    			<div>
    				<ProxyDemo></ProxyDemo>
    				{banners.length > 0 ? (
    					<ul>
    						{banners.map((element, index) => {
    							return <li key={index}> {element.title} </li>;
    						})}
    					</ul>
    				) : (
    					<div>等待数据加载</div>
    				)}
    			</div>
    		);
    	}
    }
    

    配置package.json文件解决跨域

    在package.json中添加如下代码
    "proxy": "https://music.taihe.com"

    proxyDemo.jsx

    import React from 'react';
    
    
    export default class ProxyDemo extends React.Component {
    	/**
    	 * 跨域的解决方案:
    	 *  开发模式下:
    	 *      利用环境阶级: react    vue常用框架,都提供了解决方案
    	 *  生产模式下:
    	 *      jsonp   cors    iframe  postMessage...
    	 *
    	 *      npm run build: 打包 ——> 生产模式
    	 */
    
    	componentDidMount() {
    		fetch(
    			'/v1/song/tracklink?sign=c39783d56daea7b8336074999c3ebf23&appid=16073360&TSID=T10055694882&timestamp=1612707993'
    		)
    			.then((res) => res.json())
    			.then((data) => {
    				console.log(data);
    			})
    			// 失败了
    			.catch((err) => {
    				console.log(new Error(err));
    			});
    	}
    
    	render() {
    		return <div>Hello</div>;
    	}
    }
    

    手动配置跨域

    参考地址:https://github.com/facebook/create-react-app/blob/master/docusaurus/docs/proxying-api-requests-in-development.md

    ProxyDemo.jsx

    import React from 'react';
    
    
    export default class ProxyDemo extends React.Component {
    	/**
    	 * 跨域的解决方案:
    	 *  开发模式下:
    	 *      利用环境阶级: react    vue常用框架,都提供了解决方案
    	 *  生产模式下:
    	 *      jsonp   cors    iframe  postMessage...
    	 *
    	 *      npm run build: 打包 ——> 生产模式
    	 */
    
    	componentDidMount() {
    		// fetch(
    		// 	'/v1/song/tracklink?sign=c39783d56daea7b8336074999c3ebf23&appid=16073360&TSID=T10055694882&timestamp=1612707993'
    		// )
    		// 	.then((res) => res.json())
    		// 	.then((data) => {
    		// 		console.log(data);
    		// 	})
    		// 	// 失败了
    		// 	.catch((err) => {
    		// 		console.log(new Error(err));
    		// 	});
    
    		fetch('/api/list')
    			.then((res) => res.json())
    			.then((data) => {
    				console.log(data);
    			});
    	}
    
    	render() {
    		return <div>Hello</div>;
    	}
    }
    

    router.js

    const express = require('express');
    const router = express.Router();
    
    router.get('/api/list', (req, res, next) => {
    	res.send([
    		{
    			name: 'iwen',
    			age: 20,
    		},
    		{
    			name: 'ime',
    			age: 30,
    		},
    	]);
    });
    
    module.exports = router;
    

    setupProxy.js

    const { createProxyMiddleware } = require('http-proxy-middleware');
    
    module.exports = function (app) {
    	app.use(
    		'/api',
    		createProxyMiddleware({
    			target: 'http://localhost:3100',
    			changeOrigin: true,
    		})
    	);
    };
    
  • 相关阅读:
    动态调用web服务
    组件设计实战--组件之间的关系 (Event、依赖倒置、Bridge)
    .NET平台下可复用的Tcp通信层实现
    推荐所有的.NET开发人员阅读《J2EE Development without EJB》
    关于跨程序集的反射(续)
    IoC与DI (转载)
    某公司的一道机考题的解答
    使用 EmptyClass 避免条件判断
    EsbAOP应用--权限管理
    企业(分布式)计算十大谬误
  • 原文地址:https://www.cnblogs.com/lhongsen/p/14399206.html
Copyright © 2011-2022 走看看