一、request 发起请求
1. 示例
普通 get 请求
const http = require('http')
let req = http.request('https://www.baidu.com', res => {
let data = ''
// data 事件可能触发多次
res.on('data', chunk => {
data += chunk
})
res.on('end', () => {
console.log('请求的数据 :>> ', data)
})
})
// http.request 必须手动调用 req.end 来表示请求结束,才能收到返回的数据
// 否则程序一直处于等待、挂起状态
req.end()
post 请求
const http = require('http')
const querystring = require('querystring')
// 序列化数据
const postData = querystring.stringify({
'key': 'value'
})
// 请求参数
const options = {
hostname: 'www.baidu.com',
port: 80,
path: '/upload', // 此处需以 / 开头
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
}
let req = http.request(options, res => {
let data = ''
console.log('状态码:', `${res.statusCode}`)
console.log('响应头:', `${JSON.stringify(res.headers, null, 4)}`)
res.on('data', chunk => {
data += chunk
})
res.on('end', () => {
console.log('请求的数据 :>> ', data)
})
})
req.on('error', e => {
console.log('请求发生错误:', e)
})
// 将数据写入主体,即 body 里面
req.write(postData)
req.end()
2. 语法说明
/*
* 发起请求
* @param url {string | URL |} 请求的 url 地址
* @param options {Object | integer}
* agent {http.Agent | boolean}, 控制 Agent 的行为。可能的值有:
* undefined(默认): 对此主机和端口使用 http.globalAgent
* Agent 对象: 显示的使用传入的 Agent
* false: 使用新建的具有默认值的 Agent
* auth {string} 基本的身份验证, 即 'user:password',用户计算授权请求头
* createConnection {Function} 当 agent 选项为被使用时,用来为请求生成套接字或流。
* defaultPort {number} 协议的默认端口。若使用 Agent,则默认值为 agent.defaultPort, 否则为 undefined
* family {number} 当解析 host 或者 hostname时使用的 IP 地址族。有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6
* headers {Object} 包含请求头的对象
* host {string} 请求的服务器域名或者 IP 地址,默认值为 'localhost'
* hostname {string} host 的别名。如果同时指定 host 和 hostname,则使用 hostname
* insecureHTTPParser {boolean} 使用不安全的 HTTP 解析器,为 true 时,可以接受无效的 HTTP 请求头,默认值为 false
* localAddress {string} 为网络连接绑定的本地接口
* lookup {Function} 自定义的查看函数。默认值为 dns.lookup()
* maxHeaderSize {number} 可选的,重写此服务器接收的请求的 --max-http-header-size 值,即请求头的最大长度(以字节为单位)。
* 默认值: 16384(16KB)
* method {string} 指定 HTTP 请求的方法,默认值:'GET'
* path {string} 请求的路径。应包括查询字符串(如果有的话)。例如:'/index.html?page=12'。 默认值为 '/'
* port {number} 远程服务器的端口。默认值:defaultPort(如果有设置的话) 或者 80
* protocol {string} 使用的协议。 默认值: 'http:'
* setHost {boolean} 指定是否自动添加 Host 请求头。 默认值 true
* socketPath {sring} Unix 域套接字。如果指定了 host 或 port 之一(他们指定了 TCP 套接字),则不能使用该项
* timeout {number} 指定套接字超时的数值,以毫秒为单位。在套接字被连接之前设置超时
* @param callback {Function} 回调函数
* res {IncomingMessage} 请求返回的对象,包含返回的数据、状态码、地址、方法等
*/
http.request(url[, options][, callback])
http.request(options[, callback])
备注:
-
同时指定
url
和options
,两者会进行合并,以options
属性优先 -
callback
会作为单次监听器(即只执行一次)被添加到'response'
事件 -
使用
http.request
时,必须始终调用req.end()
来表示请求的结束。 -
发送
'Connection: keep-alive'
会通知Node.js
与服务器的连接应该持续到下一个请求 -
发送
'Content-Length'
请求头会禁用默认的分开编码 -
发送授权请求头会使用
auth
选项覆盖以计算基本的身份验证
二、get 发起请求
功能和参数与 http.request 类似,只是请求方法始终设置为 GET
1. 示例
const http = require('http')
// 不需要手动调用 req.end()
let req = http.get('http://www.baidu.com', res => {
let data = ''
res.on('data', chunk => {
data += chunk
})
res.on('end', () => {
console.log('请求的数据 :>> ', data)
})
})
req.on('error', e => {
console.log('请求发生错误 :>> ', e)
})
2. 语法说明
/*
* 发起 GET 请求
*
* @param url {string | URL} 请求地址
* @param options {Object} 接受与 http.request 相同的 options,且 method 始终设置为 GET。从原型继承的属性将被忽略
* @param callback {Function}
* res {IncomingMessage} 请求返回的对象,包含返回的数据、状态码、地址、方法等
*/
http.get(url[, options][, callback])
http.get(options[, callback])
备注:
-
http.get
与http.request
的唯一区别在于http.get
将请求方法设置为GET
并自动调用req.end()
-
如果传递了
callback
参数,添加了response
处理函数(没有添加处理函数,响应将被完全废弃),
需要消费完响应对象中的数据才能释放这段数据所占内存,并且触发end
事件;添加'data'
事件处理函数,或者调用res.resume()
方法等即可消费数据
const http = require('http')
let req= http.get('http://www.baidu.com', res => {
const { statusCode } = res
let error
if (statusCode !== '0') {
console.log('请求失败,状态码为:', statusCode)
res.resume()
return
}
let data = ''
res.on('data', chunk => {
data += chunk
})
res.on('end', () => {
console.log('请求的数据 :>> ', data)
})
})