koa2中的GET与POST请求

GET

在koa2中GET请求通过request接收,接受的方法有两种:queryquerystring
query:返回的是格式化好的参数对象。
querystring:返回的是请求字符串。

下面举个例子就可以很清楚的看到两者的区别:

const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
    let url =ctx.url
    let request =ctx.request
    let req_query = request.query
    let req_querystring = request.querystring
    ctx.body={
        url,
        req_query,
        req_querystring
    }
})
app.listen(3000,()=>{
    console.log('server is starting at port 3000')
})
koa2中的GET与POST请求_第1张图片

除了在ctx.request中获取Get请求外,还可以直接在ctx中得到GET请求,也分为query和querystring,结果与ctx.request是一样的。

const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
    let url =ctx.url
    //从request中获取GET请求
    let request =ctx.request
    let req_query = request.query
    let req_querystring = request.querystring
    //从上下文中直接获取
    let ctx_query = ctx.query
    let ctx_querystring = ctx.querystring
    ctx.body={
        url,
        req_query,
        req_querystring,
        ctx_query,
        ctx_querystring
    }
})
app.listen(3000,()=>{
    console.log('server is starting at port 3000');
})
koa2中的GET与POST请求_第2张图片

POST

【ctx.request和ctx.req的区别】
ctx.request是koa2中context经过封装的请求对象,它用起来更直观和简单。
ctx.req是context提供的node.js原生HTTP请求对象,虽然不那么直观,但是可以得到更多的内容,更适合深度编程。

对于POST请求的处理,koa2没有封装方便的获取参数的方法,需要通过解析上下文context中的原生node.js请求对象req来获取。

获取POST请求的步骤:
1、解析上下文ctx中的原生nodex.js对象req。
2、将POST表单数据解析成query string-字符串(如:name=zyb&age23)。
3、将字符串转换成JSON格式。

【ctx.method】
koa2中提供了ctx.method属性,可以得到请求的类型,然后根据请求类型编写相应的方法,这在工作中非常常用。我们先来作个小例子,根据请求类型获得不同的页面内容。GET请求时得到表单填写页面,POST请求时,得到POST处理页面。

const Koa = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
    //当请求时GET请求时,显示表单让用户填写
    if(ctx.url==='/' && ctx.method === 'GET'){
        let html =`
            

Koa2 request post demo

userName


age


` ctx.body =html //当请求时POST请求时 }else if(ctx.url==='/' && ctx.method === 'POST'){ ctx.body='接收到请求' }else{ //其它请求显示404页面 ctx.body='

404!

' } }) app.listen(3000,()=>{ console.log('server is starting at port 3000') })

接下来进一步扩展,将获取到的表单格式化。

const Koa  = require('koa')
const app = new Koa()
app.use(async(ctx)=>{
    if(ctx.url==='/' && ctx.method==='GET'){
        //显示表单页面
        let html=`
            

Koa2 request post demo

userName


age


` ctx.body=html }else if(ctx.url==='/' && ctx.method==='POST'){ let pastData=await parsePostData(ctx) ctx.body=pastData }else{ ctx.body='

404!

' } }) function parsePostData(ctx){ return new Promise((resolve,reject)=>{ try{ let postdata="" ctx.req.on('data',(data)=>{ postdata += data }) ctx.req.addListener("end",function(){ let parseData = parseQueryStr( postdata ) resolve(parseData) }) }catch(error){ reject(error) } }) } function parseQueryStr(queryStr){ let queryData={} let queryStrList = queryStr.split('&') for( let [index,queryStr] of queryStrList.entries() ){ let itemList = queryStr.split('=') queryData[itemList[0]] = decodeURIComponent(itemList[1]) } return queryData } app.listen(8000,()=>{ console.log('server is starting at port 8000') })

parsePostData(ctx)使用了ctx.req.on来接收事件,难点是用了ES6的Promise来处理,然后用parseQueryStr(queryStr)将"name=zyb&age23"格式的字符串转化为JSON。

koa2中的GET与POST请求_第3张图片

koa2中的GET与POST请求_第4张图片

【参考文献】
https://jspang.com/post/koa2.html

你可能感兴趣的:(koa2中的GET与POST请求)