# Headers 对象
# 简介
Headers 代表 HTTP 消息的数据头。
它通过Headers()
构造方法,生成实例对象。Request.headers
属性和Response.headers
属性,指向的都是 Headers 实例对象。
Headers 实例对象内部,以键值对的形式保存 HTTP 消息头,可以用for...of
循环进行便利,比如for (const p of myHeaders)
。新建的 Headers 实例对象,内部是空的,需要用append()
方法添加键值对。
# 构造函数
Headers()
构造函数用来新建 Headers 实例对象。
const myHeaders = new Headers();
它可以接受一个表示 HTTP 数据头的对象,或者另一个 Headers 实例对象,作为参数。
const httpHeaders = {
"Content-Type": "image/jpeg",
"X-My-Custom-Header": "Zeke are cool",
};
const myHeaders = new Headers(httpHeaders);
2
3
4
5
最后,它还可以接受一个键值对数组,作为参数。
const headers = [
["Set-Cookie", "greeting=hello"],
["Set-Cookie", "name=world"],
];
const myHeaders = new Headers(headers);
2
3
4
5
# 实例方法
# append()
append()
方法用来添加字段。如果字段已经存在,它会将新的值添加到原有值的末端。
它接受两个参数,第一个是字段名,第二个是字段值。它没有返回值。
append(name, value)
下面是用法示例。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "image/jpeg");
2
下面是同名字段已经存在的情况。
myHeaders.append("Accept-Encoding", "deflate");
myHeaders.append("Accept-Encoding", "gzip");
myHeaders.get("Accept-Encoding"); // 'deflate, gzip'
2
3
上面示例中,Accept-Encoding
字段已经存在,所以append()
会将新的值添加到原有值的末尾。
# delete()
delete()
用来删除一个键值对,参数name
指定删除的字段名。
delete(name)
如果参数name
不是合法的字段名,或者是不可删除的字段,上面的命令会抛错。
下面是用法示例。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.delete("Content-Type");
2
3
# entries()
entries()
方法用来遍历所有键值对,返回一个 iterator 指针,供for...of
循环使用。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");
for (const pair of myHeaders.entries()) {
console.log(`${pair[0]}: ${pair[1]}`);
}
2
3
4
5
6
7
# forEach()
forEach()
方法用来遍历所有键值对,对每个指定键值对执行一个指定函数。
它的第一个参数是回调函数callbackFn
,第二个参数thisArg
是callbackFn
所用的 this 对象。
forEach(callbackFn)
forEach(callbackFn, thisArg)
2
回调函数callback
会接受到以下参数。
- value:当前的字段值。
- key:当前的字段名。
- object:当前正在执行的 Headers 对象。
下面是用法示例。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "This is a demo cookie");
myHeaders.append("compression", "gzip");
myHeaders.forEach((value, key) => {
console.log(`${key} ==> ${value}`);
});
2
3
4
5
6
7
8
# get()
get()
方法用于取出指定字段的字段值,它的参数就是字段名。如果字段名不合法(比如包含中文字符),它会抛错;如果字段在当前 Headers 对象不存在,它返回null
。
get(name)
下面是用法示例。
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.get("Content-Type"); // "image/jpeg"
2
如果当前字段有多个值,get()
会返回所有值。
# getSetCookie()
getSetCookie()
返回一个数组,包含所有Set-Cookie
设定的 Cookie 值。
const headers = new Headers({
"Set-Cookie": "name1=value1",
});
headers.append("Set-Cookie", "name2=value2");
headers.getSetCookie();
// ["name1=value1", "name2=value2"]
2
3
4
5
6
7
8
# has()
has()
返回一个布尔值,表示 Headers 对象是否包含指定字段。
has(name)
如果参数name
不是有效的 HTTP 数据头的字段名,该方法会报错。
下面是用法示例。
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.has("Content-Type"); // true
myHeaders.has("Accept-Encoding"); // false
2
3
# keys()
keys()
方法用来遍历 Headers 数据头的所有字段名。它返回的是一个 iterator 对象,供for...of
使用。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");
for (const key of myHeaders.keys()) {
console.log(key);
}
2
3
4
5
6
7
# set()
set()
方法用来为指定字段添加字段值。如果字段不存在,就添加该字段;如果字段已存在,就用新的值替换老的值,这是它与append()
方法的主要区别。
它的第一个参数name
是字段名,第二个参数value
是字段值。
set(name, value)
下面是用法示例。
const myHeaders = new Headers();
myHeaders.set("Accept-Encoding", "deflate");
myHeaders.set("Accept-Encoding", "gzip");
myHeaders.get("Accept-Encoding"); // 'gzip'
2
3
4
上面示例中,连续两次使用set()
对Accept-Encoding
赋值,第二个值会覆盖第一个值。
# values()
values()
方法用来遍历 Headers 对象的字段值。它返回一个 iterator 对象,供for...of
使用。
const myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");
for (const value of myHeaders.values()) {
console.log(value);
}
2
3
4
5
6
7