索取(Request)本系列文章的应用实例已发布在GitHub上:koa-docs-Zh-CN。您可以Fork以帮助改进或Star以关注更新。WelcomeStar.KoaRequest对象是在node的vanillarequest对象之上的抽象,为HTTP服务器开发提供了许多有用的功能。APIrequest.header请求头对象。request.header=设置请求头对象。request.headers请求标头对象。Aliasforrequest.header.request.headers=设置请求头对象。别名是request.header=.request.method请求方法。request.method=设置请求方法,对实现methodOverride()等中间件很有用。request.length以数字或未定义形式返回请求的Content-Length。request.url获取请求URL.request.url=设置请求URL,对url重写很有用。request.originalUrl获取请求的原始URL。request.origin获取URL的来源,包括协议和主机。ctx.request.origin//=>http://example.comrequest.href获取完整的请求URL,包括协议、主机和url。ctx.request.href;//=>http://example.com/foo/bar?q=1request.path获取请求路径名。request.path=设置请求路径名,并保留查询字符串(如果存在)。request.querystring根据?获取原始查询字符串request.querystring=设置原始查询字符串。request.search使用?获取原始查询字符串。request.search=设置原始查询字符串。request.host获取当前主机(主机名:端口)。当app.proxy为true时支持X-Forwarded-Host,否则使用Host。如果request.hostname存在,获取主机名。当app.proxy为true时支持X-Forwarded-Host,否则使用Host。如果主机是IPv6,Koa解析为WHATWGURLAPI,注意这可能会影响性能。request.URL获取WHATWG解析的URL对象。request.type获取不带参数“charset”的请求Content-Type。constct=ctx.request.type;//=>"image/png"request.charset获取请求字符集(如果存在或未定义):ctx.request.charset;//=>"utf-8"request.query获取解析后的查询字符串,没有查询字符串时返回空对象。请注意,此getter不支持嵌套解析。例如"color=blue&size=small":{color:'blue',size:'small'}request.query=将查询字符串设置为给定的对象。请注意,此设置器不支持嵌套对象。ctx.query={next:'/login'};request.fresh检查请求缓存是否“新鲜”,即内容没有变化。此方法用于If-None-Match/ETag,以及If-Modified-Since和Last-Modified之间的缓存协商。它应该在设置一个或多个这些响应头之后被引用。//新鲜度检查需要状态20x或304ctx.status=200;ctx.set('ETag','123');//缓存是好的if(ctx.fresh){ctx.status=304;return;}//缓存过时//获取新数据ctx.body=awaitdb.find('something');request.stale与request.fresh.request.protocol相反返回请求协议,“https”或“http”。当app.proxy为真时支持X-Forwarded-Proto。request.secure检查请求是否通过ctx.protocol=="https"通过TLS发送。request.ip请求远程地址。当app.proxy为真时支持X-Forwarded-Proto。request.ips当存在X-Forwarded-For并启用app.proxy时,将返回这些ips的数组,从上游->下游排序。禁用时返回一个空数组。request.subdomains将子域作为数组返回。子域是应用程序主域之前主机的点分隔部分。默认情况下,应用程序的域名被假定为主机的最后两部分。这可以通过设置app.subdomainOffset来改变。例如,如果域名是“tobi.ferrets.example.com”:如果没有设置app.subdomainOffset,ctx.subdomains就是["ferrets","tobi"]。如果app.subdomainOffset为3,则ctx.subdomainsis["tobi"].request.is(types...)检查传入请求是否包含Content-Type标头字段,以及是否包含任何mime类型。如果没有请求主体,则返回null。如果没有内容类型,或者匹配失败,则返回false。否则,返回匹配的内容类型。//使用内容类型:text/html;charset=utf-8ctx.is('html');//=>'html'ctx.is('text/html');//=>'text/html''ctx.is('text/*','text/html');//=>'text/html'//当Content-Type是application/jsonctx.is('json','urlencoded');//=>'json'ctx.is('application/json');//=>'application/json'ctx.is('html','application/*');//=>'application/json'ctx.is('html');//=>false例如,如果你想确保只有图像被发送到给定的路由:if(ctx.is('image/*')){//process}else{ctx.throw(415,'imagesonly!');}ContentNegotiationKoa的请求对象包括由accepts和negotiator提供的有用的内容协商实体。这些实用程序是:request.accepts(types)request.acceptsEncodings(types)request.acceptsCharsets(charsets)request.acceptsLanguages(langs)如果没有提供类型,则返回所有可接受的类型。如果提供多种类型,将返回最佳匹配。如果未找到匹配项,则返回false,您应该向客户端发送406“NotAcceptable”响应。如果接收到任何类型的接收标头,将返回第一个类型。因此,您提供的类型的顺序很重要。request.accepts(types)检查给定类型是否可接受,如果为真,则返回最佳匹配,否则为假。type值可以是一个或多个mime类型的字符串,例如application/json,扩展名,例如json,或者数组["json","html","text/plain"]。//接受:text/htmlctx.accepts('html');//=>"html"//接受:text/*,application/jsonctx.accepts('html');//=>"html"ctx.accepts('text/html');//=>"text/html"ctx.accepts('json','text');//=>"json"ctx.accepts('application/json');//=>"application/json"//Accept:text/*,application/jsonctx.accepts('image/png');ctx.accepts('png');//=>false//Accept:文本/*;q=.5,application/jsonctx.accepts(['html','json']);ctx.accepts('html','json');//=>"json"//不接受headerctx.accepts('html','json');//=>"html"ctx.accepts('json','html');//=>"json"你可以多次调用ctx.accepts()想要,或者使用switch:switch(ctx.accepts('json','html','text')){case'json':break;案例'html':中断;案例“文本”:中断;默认值:ctx.throw(406,'json,html,ortextonly');}request.acceptsEncodings(encodings)检查编码是否可接受,为最佳匹配返回true,否则为false。请注意,您应该将标识作为其中一种编码!//接受编码:gzipctx.acceptsEncodings('gzip','deflate','identity');//=>"gzip"ctx.acceptsEncodings(['gzip','deflate','identity']);//=>"gzip"当没有给出参数时,所有接受的编码将作为数组返回://Accept-Encoding:gzip,deflatectx.acceptsEncodings();//=>["gzip","deflate","identity"]请注意,如果客户端显式发送identity;q=0,则身份编码(即无编码)可能不可接受。虽然这是一种边缘情况,但您仍应处理此方法返回false的情况。request.acceptsCharsets(charsets)检查字符集是否可接受,如果为真则返回最佳匹配,否则为假。//Accept-Charset:utf-8,iso-8859-1;q=0.2,utf-7;q=0.5ctx.acceptsCharsets('utf-8','utf-7');//=>"utf-8"ctx.acceptsCharsets(['utf-7','utf-8']);//=>"utf-8"当没有给出参数时,所有接受的字符集将作为数组返回//Accept-Charset:utf-8,iso-8859-1;q=0.2,utf-7;q=0.5ctx.acceptsCharsets();//=>["utf-8","utf-7","iso-8859-1"]request.acceptsLanguages(langs)检查语言是否可接受,如果为真,则返回最佳匹配,否则为假。//接受语言:en;q=0.8,es,ptctx.acceptsLanguages('es','en');//=>"es"ctx.acceptsLanguages(['en','es']);//=>"es"当没有给出参数时,所有接受的语言将作为数组返回://Accept-Language:en;q=0.8,es,ptctx.acceptsLanguages();//=>["es","pt","en"]request.idempotent检查请求是否幂等。request.socket返回请求套接字。request.get(field)返回请求标头。如果本文对您有帮助,请在下方点赞或StarGitHub:koa-docs-Zh-CN支持,谢谢。
