http
最后更新于:2022-04-01 04:34:58
[TOC=2,4]
这里的 http 对象并不是 Node.js 里的 http 模块,而是对 request 和 response 对象包装后一个新的对象。
~~~
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
}).listen(8124);
~~~
如上面的代码所示,Node.js 创建服务时,会传递 request 和 response 2个对象给回调函数。为了后续调用方便, ThinkJS 对这2个对象进行了包装,包装成了 http 对象,并且提供很多有用的方法。
http 对象会在 middleware, logic, controller, view 中传递。
`注`:http 对象是 EventEmitter 的一个实例,所以可以对其进行事件监听和执行。
### 属性
#### http.req
系统原生的 request 对象
#### http.res
系统原生的 response 对象
#### http.startTime
请求的开始时间,是个`unix`时间戳。
#### http.url
当前请求的 url 。
#### http.version
当前请求的 http 版本。
#### http.method
当前请求的类型。
#### http.headers
当前请求的所有头信息。
#### http.pathname
当前请求的 pathname,路由识别会依赖该值,会在后续的处理中对其进行改变。所以在 action 拿到值可能跟初始解析出来的值不一致。
#### http.query
当前请求的所有 query 数据。
#### http.host
当前请求的 host, 包含端口。
#### http.hostname
当前请求的 hostname,不包含端口。
#### http.payload
当前请求的 payload 数据,提交型的请求才含有该值。
#### http._payloadParsed
表示当前请求的 payload 数据是否已经解析。
#### http._get
存放 GET 参数值。
#### http._post
存放 POST 参数值
#### http._file
存放上传的文件数据
#### http._cookie
存放 cookie 数据。
### 方法
#### http.config(name)
* `name` {String} 参数名
* `return` {Mixed} 返回对应的参数值
获取当前请求下对应的参数值。
#### http.referrer()
* `return` {String} 请求的 referrer
返回当前请求的 referrer。
#### http.userAgent()
* `return` {String} 请求的 userAgent
返回当前请求的 userAgent。
#### http.isGet()
* `return` {Boolean}
返回当前请求是否是 GET 请求。
#### http.isPost()
* `return` {Boolean}
返回当前请求是否是 POST 请求。
#### http.isAjax(method)
* `method` {String} 请求类型
* `return` {Boolean}
返回当前请求是否是 Ajax 请求。
~~~
http.isAjax(); //判断是否是Ajax请求
http.isAjax("GET"); //判断是否是Ajax请求,且请求类型是GET
~~~
#### http.isJsonp(name)
* `name` {String} callback 参数名称,默认为 callback
* `return` {Boolean}
返回当前请求是否是 jsonp 请求。
~~~
//url is /index/test?callback=testxxx
http.isJsonp(); //true
http.isJsonp("cb"); //false
~~~
#### http.get(name, value)
* `name` {String} 参数名称
* `value` {Mixed} 参数值
获取或者设置 GET 参数值。可以通过该方法设置 GET 参数值,方便后续的逻辑里获取。
~~~
// url is /index/test?name=thinkjs
http.get("name"); // returns "thinkjs"
http.get("name", "other value");
http.get("name"); // returns "other value"
~~~
#### http.post(name, value)
* `name` {String} 参数名称
* `value` {Mixed} 参数值
获取或者设置 POST 值。可以通过该方法设置 POST 值,方便后续的逻辑里获取。
~~~
http.post("email"); //获取提交的email
~~~
#### http.param(name)
* `name` {String} 参数名称
* `return` {Mixed}
获取参数值,优先从 POST 里获取,如果值为空,则从 URL 参数里获取。
#### http.file(name)
* `name` {String} 文件对应的字段名称
* `return` {Object}
获取上传的文件。
~~~
http.file("image");
//returns
{
fieldName: "image", //表单里的字段名
originalFilename: filename, //原始文件名
path: filepath, //文件临时存放的路径
size: size //文件大小
}
~~~
#### http.header(name, value)
* `name` {String} header 名称
* `value` {String} header 值
获取或者设置 header 信息。
~~~
http.header("accept"); //获取accept
http.header("X-NAME", "thinkjs"); //设置header
~~~
#### http.expires(time)
* `time` {Number} 过期时间,单位为秒
强缓存,设置 `Cache-Control` 和 `Expires` 头信息。
~~~
http.header(86400); //设置过期时间为 1 天。
~~~
#### http.status(status)
设置状态码。如果头信息已经发送,则无法设置状态码。
~~~
http.status(400); //设置状态码为400
~~~
#### http.ip()
获取用户的 ip 。如果使用了代理,获取的值可能不准。
#### http.lang(lang, asViewPath)
* `lang` {String} 要设置的语言
* `asViewPath` {Boolean} 是否添加一层模版语言目录
获取或者设置国际化的语言,可以支持模版路径要多一层语言的目录。
##### 获取语言
~~~
let lang = http.lang();
~~~
获取语言的循序为 `http._lang` -> `从 cookie 中获取` -> `从 header 中获取`,如果需要从 url 中解析语言,可以获取后通过 `http.lang(lang)` 方法设置到属性 `http._lang` 中。
##### 设置语言
~~~
let lang = getFromUrl();
http.lang(lang, true); //设置语言,并指定模版路径中添加一层语言目录
~~~
#### http.theme(theme)
获取或者设置主题,设置后模版路径要多一层主题的目录。
#### http.cookie(name, value)
* `name` {String} cookie 名称
* `value` {String} cookie 值
读取或者设置 cookie 值。
~~~
http.cookie("think_test"); //获取名为 think_test 的 cookie
http.cookie("name", "value"); //设置 cookie,如果头信息已经发送则设置无效
~~~
#### http.session(name, value)
* `name` {String} session 名
* `value` {Mixed} session 值
* `return` {Promise}
读取、设置和清除 session。
##### 读取 Session
~~~
let value = yield http.session("userInfo");
~~~
##### 设置 Session
~~~
yield http.session("userInfo", data);
~~~
##### 清除 Session
~~~
yield http.session();
~~~
#### http.redirect(url, status)
* `url` {String} 要跳转的 url
* `status` {Number} 状态码, 301 或者 302,默认为302
页面跳转。
~~~
http.redirect("/login"); //跳转到登录页面
~~~
#### http.type(contentType, encoding)
* `contentType` {String} 要设置的 contentType
* `encoding` {String} 要设置的编码
获取或者设置 Content-Type。
~~~
http.type(); //获取Content-Type
http.type("text/html"); //设置Content-Type,会自动加上charset
http.type("audio/mpeg", false); //设置Content-Type,不追加charset
~~~
#### http.write(content, encoding)
* `content` {Mixed} 要输出的内容
* `encoding` {String} 编码
输出内容,要调用 http.end 才能结束当前请求。
#### http.end(content, encoding)
* `content` {Mixed} 要输出的内容
* `encoding` {String} 编码
输出内容并结束当前请求。
#### http.success(data, message)
* `data` {Mixed} 要输出的数据
* `message` {String} 追加的message
格式化输出一个正常的数据,一般是操作成功后输出。
~~~
http.success({name: "thinkjs"});
//writes
{
errno: 0,
errmsg: "",
data: {
name: "thinkjs"
}
}
~~~
这样客户端就可以根据`errno`是否为`0`为判断当前请求是否正常。
#### http.fail(errno, errmsg, data)
* `errno` {Number} 错误号
* `errmsg` {String} 错误信息
* `data` {Mixed} 额外的数据
格式化输出一个异常的数据,一般是操作失败后输出。
`注`:字段名`errno`和`errmsg`可以在配置里进行修改。
~~~
http.fail(100, "fail")
//writes
{
errno: 100,
errmsg: "fail",
data: ""
}
~~~
这样客户端就可以拿到具体的错误号和错误信息,然后根据需要显示了。
`注`:字段名`errno`和`errmsg`可以在配置里进行修改。
#### http.json(data)
* `data` {Object}
json 方式输出数据,会设置 Content-Type 为 `application/json`,该值对应的配置为`json_content_type`。
文档地址:[https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_http.md](https://github.com/75team/www.thinkjs.org/tree/master/view/zh-CN/doc/2.0/api_http.md)