一、Ajax 设置请求头解决跨域
在跨域请求时,请求头设置是一个必要的步骤。一般情况下,Ajax 请求不带请求头信息。如果我们需要传递一些头信息,就需要设置请求头。Ajax 设置请求头一般用于解决跨域请求。
跨域请求通常经过两次请求,第一次发送一个 Option 请求,获取服务端允许的请求方法和头信息等,之后再发送真正的请求。为了解决跨域请求,服务器需要允许请求头信息。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open("GET", "http://example.com/getData", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer xxxxxxx");
xhr.send();
二、Ajax 设置请求头会被转义不
当我们设置请求头信息时,浏览器通常会自动进行编码,跟数据传输时一样。因此,即使我们设置了一些特殊字符,请求头也不会被转义。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open("GET", "http://example.com/getData", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Custom-Header", "Special & \"Quotes\"");
xhr.send();
三、Ajax 设置请求头编码
请求头设置时,需要注意编码问题。默认情况下,浏览器会对请求头进行URL编码。我们可以使用encodeURIComponent()方法对请求头进行编码,以避免浏览器编码的影响。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open("GET", "http://example.com/getData", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Custom-Header", encodeURIComponent("Special & \"Quotes\""));
xhr.send();
四、Ajax 设置头信息
在请求头中,我们可以设置很多信息,如User-Agent头、Host头、Referer头等。这些头信息可以方便地帮助服务器了解请求者的客户端情况,或者进行一些安全检验。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open("GET", "http://example.com/getData", true);
xhr.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0");
xhr.setRequestHeader("Referer", "http://example.com");
xhr.send();
五、Ajax 添加请求头参数
在发送请求时,我们有时需要添加一些额外的参数,以获取更多的信息。请求头中的参数通常以key-value的形式出现。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open("GET", "http://example.com/getData", true);
xhr.setRequestHeader("Content-Type", "application/json");
const params = {
key1: "value1",
key2: "value2",
}
xhr.setRequestHeader("Params", JSON.stringify(params));
xhr.send();
六、Ajax 加请求头
当我们发送多次Ajax请求时,可以使用封装函数的方式来复用代码。这样可以避免重复编写请求头信息。我们可以使用对象的方式来封装请求头信息,并将其作为参数传递给Ajax请求函数。
代码示例:
function ajax(options) {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
xhr.open(options.method, options.url, true);
if (options.headers) {
for (let key in options.headers) {
xhr.setRequestHeader(key, options.headers[key]);
}
}
xhr.send(options.data);
}
const options = {
method: "GET",
url: "http://example.com/getData",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer xxxxxxxx"
}
}
ajax(options);
七、Ajax get 请求头
Ajax 可以通过get方式获取服务器数据,请求头中不加请求体参数信息;如果需要添加一些特殊的信息,同样可以通过设置请求头信息来实现。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
const params = {
key1: "value1"
}
xhr.open("GET", http://example.com/getData?key1=value1, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer xxxxxxxx")
xhr.send();
八、Ajax 的请求里面的头信息
在Ajax 请求中,我们可以获取请求时携带的头信息。我们可以使用getAllResponseHeaders()方法来获取所有头信息,或者使用getResponseHeader()方法获取指定的头信息。
代码示例:
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
const headers = xhr.getAllResponseHeaders();
const contentType = xhr.getResponseHeader("Content-Type");
console.log(headers);
console.log(contentType);
}
}
const params = {
key1: "value1"
}
xhr.open("GET", http://example.com/getData?key1=value1, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", "Bearer xxxxxxxx")
xhr.send();