首先,前端向后端发送网络请求的方式有:
1、GET请求
2、POST请求
然后,能做网络请求的技术有:
1.浏览器的地址栏 --- 前端给后端发送字段,只能使用GET请求。
浏览器地址栏接受的数据会直接读取渲染,如果解析失败会下载。
2.css中的一些标签,如:
(1)img标签 --- 只能发送GET请求
(2) link标签 --- 只能发送GET请求
(3) 如background-image的url() --- 也只能发送GET请求
(4) a标签 --- 只能发送GET请求
(5) script标签的src --- 只能发送GET请求
3.既能发送GET请求又能发送POST请求的技术:
(1) form表单的提交
(2) AJAX技术,以及基于AJAX封装的框架
使用脚手架快速创建项目的指令:
npm init egg --type=simple
下载相关依赖文件的指令:
npm i
启动项目的指令:
npm run dev
egg框架的默认端口号是:7001; 即访问时在浏览器地址栏输入: http://x.x.x.x:7001
egg框架的约定规则:
1 app/router.js:用于配置URL路由规则;
2 app/controller/** :用于解析用户的输入,处理后返回相应的结果;
3 app/service/: 用于编写业务逻辑层;
4 app/public/: 用于放置静态资源;
5 config/config.{env}.js: 用于编写配置文件;
6 config/plugin.js 用于配置需要加载的插件;
是设置用户访问时的网址的设置:
- router.get('/ajax', controller.home.index); //代表controller文件下的home文件夹里的index方法
-
- router.post('/register',controller.home.register) //代表controller文件下的home文件夹里的register方法
Controller控制器:
Controller负责解析用户的输入,处理后返回响应的结果。
1.所有的Controller 文件都必须放在 app/controller目录下
2.支持多级目录,访问时可以通过目录名级联访问。
- async index() {
- const { ctx } = this;
- ctx.body = 'hi, egg';
- }
-
- async register() {
- const { ctx } = this;
- ctx.body = 'hello world';
- }
跨域 --- CORS的配置:
1.下载插件
npm i --save egg-cors
2.开启插件,在 config/plugin.js文件中配置:
- cors:{
- enable: true,
- package: 'egg-cors',
- }
3.配置插件,在config/config.default.js文件中配置:有两种方式:
方式一:默认全部可访问
- config.cors = {
- origin: '*',
- allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
- };
方式二:具体指定多个网址可以访问
- config.cors = {
- // origin: ['http://localhost'],
- origin:function(ctx) { //设置允许来自指定域名请求
- console.log(ctx);
- const whiteList = [网址1,网址2,网址3];
- let url = ctx.request.header.origin;
- if(whiteList.includes(url)){
- return url;
- }
- return 'http://localhost' //默认允许本地请求可跨域
- },
- allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
- };
跨域 --- JSONP的配置:也有两种方式
方式一:实现JSONP接口:
在config/config.default.js文件中配置:
- config.jsonp = {
- callback: 'cb', // 识别 query 中的 `cb` 参数
- limit: 100, // 函数名最长为 100 个字符
- };
然后在router.js文件中写接口:
- module.exports = app => {
- const jsonp = app.jsonp();
- app.router.get('/api', jsonp, app.controller.home.api);
- };
方法二:直接在jsonp方法中直接配置:在router.js文件中
- module.exports = app => {
- const jsonp = app.jsonp({
- callback: 'cb',
- limit: 100,
- });
- app.router.get('/api', jsonp, app.controller.home.api);
- };
跨域 --- 代理的配置
在controller文件夹中的home.js文件中:
- async cors(){
- let data=await this.ctx.curl("网址",{method:"GET",data:{count:123})
- this.ctx.body=data
- }
GET请求传参数给后端,参数会拼接到url中,此方法的特点是速度快,但是它不安全
后端接收GET请求的数据:ctx.request.query 或者 ctx.query
router.js:
router.get('/get1', controller.home.get1);
home.js:
- async get1() {
-
- var k = this.ctx.request.query
-
- this.ctx.body = {
- info: "get1接口的数据"
- }
- }
(1)AJAX技术
- var xhr=new XMLHttpRequest()
- var url=`http://192.168.1.123:7001/get1?username=xiaozhang&pwd=123`
- xhr.open("GET",url)
- xhr.send()
- xhr.onreadystatechange=()=>{
- if(xhr.readyState==4&&xhr.status==200){
- console.log(xhr.responseText)
- }
- }
(2)axios技术
- axios("网址",{params:{username:xiaozhang,pwd:123}})
- .then(res => {
- console.log(res)
- })
也就是将params传入的值直接拼接到网址之后的querystring部分。
将数据转为暗文发送,选择POST方式
后端接收POST请求的数据:ctx.request.body 而不是 ctx.body
1、post请求时,会有安全验证问题,简单的处理方式是关闭安全验证:在config/config.default.js文件中配置:
- config.security={
- csrf:{
- enable:false
- }
- };
2、post数据默认大小是100kb 如需调整可在 config/config.default.js 中覆盖框架的默认值:
- module.exports = {
- bodyParser: {
- jsonLimit: '10mb',
- formLimit: '10mb',
- },
- };
设置POST请求:
(1)AJAX技术
- var xhr=new XMLHttpRequest()
- var url="http://192.168.1.123:7001/post1"
- xhr.open("POST",url,true)
- //这个函数接受字符串:querystring
- //如果"POST"就会把这个请求的数据放在"请求数据包"-HTTPRequestMessage 的请求体中的
- //如果是"GET",不会报错 但是也并不会把这个数据拼接到url中发送
- xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- xhr.send(`userid=${userid.value}&pwd=${pwd.value}`)
- xhr.onreadystatechange=function(){
- if(xhr.readyState==4&&xhr.status==200){
- console.log(xhr.responseText)
- }
- }
(2)axios技术
- var url="http://192.168.1.123:7001/post1"
- axios.post(url,{username:xiaozhang,pwd:123})
- .then(res=>console.log(res))
router.js:
router.post('/post1', controller.home.post1);
home.js:
- async post1() {
- //1.前端POST发送给egg的参数字段
- let obj=this.ctx.request.body
- let query=this.ctx.request.query
- console.log(obj,query)
- this.ctx.body={info:"post数据",res:obj}
- }
1.egg必须启用 file 模式,在config/config.default.js文件中配置:
- config.multipart = {
- mode: 'file',
- };
2.把要给后端发送的"大量"数据:文件 处理成表单数据
- var f1=document.querySelector("#f1")
- var userid=document.querySelector("#userid")
- var pwd=document.querySelector("#pwd")
- var fdata=new FormData()
- //发送的数据
- fdata.append("userid",userid.value)
- fdata.append("pwd",pwd.value)
- //发送的文件
- fdata.append("touxiang",f1.files[0])
-
- var url="http://192.168.1.123:7001/post2"
- axios.post(url,fdata)
- .then(res=>console.log(res))
router.js:
router.post('/post2', controller.home.post2);
后端接收:
- async post2(){
- //1.前端POST发送给egg的参数字段
- let ziduan=this.ctx.request.body
- //2.前端POST发送给egg的参数文件
- let f=this.ctx.request.files
- console.log(ziduan,f)
-
- //将接收的文件移动至指定的文件夹
- if(f[0]){
- let oldpath=f[0].filepath
- let fname=path.basename(oldpath)
- let newpath=__dirname+"/../public/upload/"+fname
- fs.renameSync(oldpath,newpath)
- }
-
- this.ctx.body={info:"post2的数据"}
- }