egg.js php,Egg.js里如何获取HTTP参数

这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。

这次给大家带来Egg.js里如何获取HTTP参数,Egg.js里获取HTTP参数的注意事项有哪些,下面就是实战案例,一起来看一下。

在Egg.js框架中,由于 Controller基本上是业务开发中唯一和HTTP 协议打交道的地方,所以框架通过在 Controller上绑定的 Context实例,提供了许多便捷方法和属性获取用户通过 HTTP请求发送过来的参数。本文就总结一下获取http请求的参数方法:

1.query

在 URL 中 ?后面的部分是一个 Query String,这一部分经常用于 GET 类型的请求中传递参数。例如 GET /search?name=egg&age=26中 name=egg&age=26 就是用户传递过来的参数。我们可以通过 context.query(为一个对象)拿到解析过后的这个参数体module.exports = app => { class SearchController extends app.Controller {

* search() { const queryObj = this.ctx.query; console.log(queryObj.age); console.log(queryObj); //打印结果:{ name: 'egg', age: '26' }

}

} return SearchController;

};

当 Query String 中的 key 重复时,context.query只取 key 第一次出现时的值,后面再出现的都会被忽略。GET /posts?category=egg&category=koa 通过 context.query拿到的值是 { category: 'egg' }。

1.1 queries

有时候我们的系统会设计成让用户传递相同的 key,例如 GET /posts?category=egg&id=1&id=2&id=3。针对此类情况,框架提供了 context.queries 对象,这个对象也解析了 Query String,但是它不会丢弃任何一个重复的数据,而是将他们都放到一个数组中:// GET /posts?category=egg&id=1&id=2&id=3const Controller = require('egg').Controller;module.exports = class PostController extends Controller {

* listPosts() { console.log(this.ctx.queries); //result:

// {

// category: [ 'egg' ],

// id: [ '1', '2', '3' ],

// }

}

};

context.queries上所有的 key 如果有值,也一定会是数组类型。

2. Router params

我们知道在 Router 上也可以申明参数,这些参数都可以通过 context.params获取到。// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2const Controller = require('egg').Controller;module.exports = class AppController extends Controller {

* listApp() { assert.equal(this.ctx.params.projectId, '1'); assert.equal(this.ctx.params.appId, '2');

}

};

3. body

虽然我们可以通过 URL 传递参数,但是还是有诸多限制:

浏览器中会对 URL 的长度有所限制,如果需要传递的参数过多就会无法传递。

服务端经常会将访问的完整 URL 记录到日志文件中,有一些敏感数据通过 URL 传递会不安全。

我们知道在 header之后还有一个 body部分,我们通常会在这个部分传递 POST、PUT 和 DELETE 等方法的参数。一般请求中有 body的时候,客户端(浏览器)会同时发送 Content-Type告诉服务端这次请求的 body 是什么格式的。Web 开发中数据传递最常用的两类格式分别是 JSON和 Form。

框架内置了 bodyParser 中间件来对这两类格式的请求 body 解析成 object 挂载到 context.request.body上。HTTP协议中并不建议在通过 GET、HEAD 方法访问时传递 body,所以我们无法在 GET、HEAD 方法中按照此方法获取到内容。// POST /api/posts HTTP/1.1// Host: localhost:3000// Content-Type: application/json; charset=UTF-8 {"title": "controller", "content": "what is controller"}const Controller = require('egg').Controller;module.exports = class PostController extends Controller {

* listPosts() { assert.equal(this.ctx.request.body.title, 'controller'); assert.equal(this.ctx.request.body.content, 'what is controller');

}

};

框架对 bodyParser 设置了一些默认参数,配置好之后拥有以下特性:

当请求的 Content-Type 为 application/json,application/json-patch+json,application/vnd.api+json 和 application/csp-report 时,会按照 json格式对请求 body 进行解析,并限制 body 最大长度为 100kb。

当请求的 Content-Type 为 application/x-www-form-urlencoded 时,会按照 form 格式对请求 body 进行解析,并限制 body 最大长度为 100kb。

如果解析成功,body 一定会是一个 Object(可能是一个数组)。

一般来说我们最经常调整的配置项就是变更解析时允许的最大长度,可以在 config/config.default.js中覆盖框架的默认值module.exports = {

bodyParser: {

jsonLimit: '1mb',

formLimit: '1mb',

},

};

如果用户的请求 body 超过了我们配置的解析最大长度,会抛出一个状态码为 413 的异常,如果用户请求的 body 解析失败(错误的 JSON),会抛出一个状态码为 400的异常。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值