XMLHttpRequest
的基础使用。XMLHttpRequest
对象。axios
是对 XHR
的封装,简化了接口参数传递。XHR
可帮助理解 axios
内部与服务器交互的原理。javascript
const xhr = new XMLHttpRequest(); |
|
xhr.open('请求方法', '请求url网址'); |
|
xhr.addEventListener('loadend', () => { |
|
console.log(xhr.response); |
|
}); |
|
xhr.send(); |
html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const xhr = new XMLHttpRequest(); |
|
xhr.open('GET', 'http://hmajax.itheima.net/api/province'); |
|
xhr.addEventListener('loadend', () => { |
|
const data = JSON.parse(xhr.response); |
|
document.querySelector('.my-p').innerHTML = data.list.join(' |
|
}); |
|
xhr.send(); |
|
|
|
|
|
|
window
提供的 XMLHttpRequest
对象。axios
内部原理。XHR
对象。open
方法,设置 URL 和请求方法。loadend
事件,接收结果。send
方法,发起请求。XHR
传递查询参数给服务器,获取匹配数据。http://xxxx.com/xxx/xxx?参数名1=值1&参数名2=值2
。XHR
需手动拼接查询参数字符串。javascript
const xhr = new XMLHttpRequest(); |
|
xhr.open('GET', 'http://hmajax.itheima.net/api/city?pname=辽宁省'); |
|
xhr.addEventListener('loadend', () => { |
|
const data = JSON.parse(xhr.response); |
|
document.querySelector('.city-p').innerHTML = data.list.join(' |
|
}); |
|
xhr.send(); |
open
方法的 URL 后拼接参数名和值。XHR
完成地区查询案例。URLSearchParams
javascript
const paramsObj = new URLSearchParams({ |
|
参数名1: 值1, |
|
参数名2: 值2 |
|
}); |
|
const queryString = paramsObj.toString(); |
|
// 结果:参数名1=值1&参数名2=值2 |
URLSearchParams
对象。XHR
提交用户名和密码,完成注册功能。XHR
提交用户注册信息。Content-Type: application/json
。send
方法中携带请求体数据。javascript
document.querySelector('.reg-btn').addEventListener('click', () => { |
|
const xhr = new XMLHttpRequest(); |
|
xhr.open('POST', 'http://hmajax.itheima.net/api/register'); |
|
xhr.addEventListener('loadend', () => { |
|
console.log(xhr.response); |
|
}); |
|
xhr.setRequestHeader('Content-Type', 'application/json'); |
|
const userObj = { username: 'itheima007', password: '7654321' }; |
|
const userStr = JSON.stringify(userObj); |
|
xhr.send(userStr); |
|
}); |
send
中携带请求体数据,并设置 Content-Type
。Promise
的作用、好处及使用步骤。Promise
Promise
的好处javascript
const p = new Promise((resolve, reject) => { |
|
// 执行异步任务 |
|
// 成功调用 resolve(值),失败调用 reject(值) |
|
}); |
|
p.then(result => { |
|
// 成功 |
|
}).catch(error => { |
|
// 失败 |
|
}); |
javascript
const p = new Promise((resolve, reject) => { |
|
setTimeout(() => { |
|
reject(new Error('模拟AJAX请求-失败结果')); |
|
}, 2000); |
|
}); |
|
p.then(result => { |
|
console.log(result); |
|
}).catch(error => { |
|
console.log(error); |
|
}); |
Promise
是什么:表示一个异步操作最终状态和结果值的对象。Promise
的原因:了解 axios
内部运作原理。Promise
对象,执行异步任务。resolve
关联 then
的回调函数。reject
关联 catch
的回调函数。Promise
的三种状态及其作用。pending
、fulfilled
、rejected
。Promise
管理 XHR
异步任务。Promise
和 XHR
请求省份列表数据并展示到页面。javascript
const p = new Promise((resolve, reject) => { |
|
const xhr = new XMLHttpRequest(); |
|
xhr.open('GET', 'http://hmajax.itheima.net/api/province'); |
|
xhr.addEventListener('loadend', () => { |
|
if (xhr.status >= 200 && xhr.status < 300) { |
|
resolve(JSON.parse(xhr.response)); |
|
} else { |
|
reject(new Error(xhr.response)); |
|
} |
|
}); |
|
xhr.send(); |
|
}); |
|
p.then(result => { |
|
document.querySelector('.my-p').innerHTML = result.list.join(' |
|
}).catch(error => { |
|
console.dir(error); |
|
document.querySelector('.my-p').innerHTML = error.message; |
|
}); |
200
到 300
之间。axios
函数封装,了解其内部运作原理。Promise
和 XHR
封装 myAxios
函数,获取省份列表。javascript
function myAxios(config) { |
|
return new Promise((resolve, reject) => { |
|
const xhr = new XMLHttpRequest(); |
|
xhr.open(config.method || 'GET', config.url); |
|
xhr.addEventListener('loadend', () => { |
|
if (xhr.status >= 200 && xhr.status < 300) { |
|
resolve(JSON.parse(xhr.response)); |
|
} else { |
|
reject(new Error(xhr.response)); |
|
} |
|
}); |
|
xhr.send(); |
|
}); |
|
} |
|
myAxios({ |
|
url: 'http://hmajax.itheima.net/api/province' |
|
}).then(result => { |
|
console.log(result); |
|
}).catch(error => { |
|
console.log(error); |
|
}); |
config.method
判断有值就用,无值用 GET
。myAxios
函数支持传递查询参数,获取地区列表。javascript
function myAxios(config) { |
|
return new Promise((resolve, reject) => { |
|
const xhr = new XMLHttpRequest(); |
|
if (config.params) { |
|
const paramsObj = new URLSearchParams(config.params); |
|
const queryString = paramsObj.toString(); |
|
config.url += `?${queryString}`; |
|
} |
|
xhr.open(config.method || 'GET', config.url); |
|
xhr.addEventListener('loadend', () => { |
|
if (xhr.status >= 200 && xhr.status < 300) { |
|
resolve(JSON.parse(xhr.response)); |
|
} else { |
|
reject(new Error(xhr.response)); |
|
} |
|
}); |
|
xhr.send(); |
|
}); |
|
} |
|
myAxios({ |
|
url: 'http://hmajax.itheima.net/api/area', |
|
params: { |
|
pname: '辽宁省', |
|
cname: '大连市' |
|
} |
|
}).then(result => { |
|
console.log(result); |
|
}); |
URLSearchParams
对象。myAxios
函数支持传递请求体数据,完成注册用户。javascript
function myAxios(config) { |
|
return new Promise((resolve, reject) => { |
|
const xhr = new XMLHttpRequest(); |
|
if (config.params) { |
|
const paramsObj = new URLSearchParams(config.params); |
|
const queryString = paramsObj.toString(); |
|
config.url += `?${queryString}`; |
|
} |
|
xhr.open(config.method || 'GET', config.url); |
|
xhr.addEventListener('loadend', () => { |
|
if (xhr.status >= 200 && xhr.status < 300) { |
|
resolve(JSON.parse(xhr.response)); |
|
} else { |
|
reject(new Error(xhr.response)); |
|
} |
|
}); |
|
if (config.data) { |
|
const jsonStr = JSON.stringify(config.data); |
|
xhr.setRequestHeader('Content-Type', 'application/json'); |
|
xhr.send(jsonStr); |
|
} else { |
|
xhr.send(); |
|
} |
|
}); |
|
} |
|
document.querySelector('.reg-btn').addEventListener('click', () => { |
|
myAxios({ |
|
url: 'http://hmajax.itheima.net/api/register', |
|
method: 'POST', |
|
data: { |
|
username: 'itheima999', |
|
password: '666666' |
|
} |
|
}).then(result => { |
|
console.log(result); |
|
}).catch(error => { |
|
console.dir(error); |
|
}); |
|
}); |
data
选项,转成 JSON 字符串并设置请求头。javascript
function getWeather(cityCode) { |
|
myAxios({ |
|
url: 'http://hmajax.itheima.net/api/weather', |
|
params: { |
|
city: cityCode |
|
} |
|
}).then(result => { |
|
const wObj = result.data; |
|
document.querySelector('.title').innerHTML = ` |
|
${wObj.date} |
|
农历 |
|
${wObj.dateLunar} |
|
|
|
`; |
|
document.querySelector('.area').innerHTML = wObj.area; |
|
document.querySelector('.weather-box').innerHTML = ` |
|
|
|
|
|
${wObj.temperature} |
|
° |
|
|
|
|
|
|
|
|
|
${wObj.psPm25} |
|
${wObj.psPm25Level} |
|
|
|
|
|
|
|
|
|
${wObj.weather} |
|
|
|
|
|
|
|
|
|
|
|
`; |
|
}); |
|
} |
|
getWeather('110100'); |
myAxios
函数。javascript
document.querySelector('.search-city').addEventListener('input', (e) => { |
|
myAxios({ |
|
url: 'http://hmajax.itheima.net/api/weather/city', |
|
params: { |
|
city: e.target.value |
|
} |
|
}).then(result => { |
|
const liStr = result.data.map(item => { |
|
return ` |
|
}).join(''); |
|
document.querySelector('.search-list').innerHTML = liStr; |
|
}); |
|
}); |
input
事件。javascript
document.querySelector('.search-list').addEventListener('click', e => { |
|
if (e.target.classList.contains('city-item')) { |
|
const cityCode = e.target.dataset.code; |
|
getWeather(cityCode); |
|
} |
|
}); |
code
值。