一、与后端交互方式

Form 表单提交

  • 只支持 GET 和 POST 类型
  • 缺点:提交后页面会刷新,用户体验不佳

AJAX
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)

  • 支持多种请求方法
  • 使用内置的 XMLHttpRequest 和 fetch 对象,实现和服务器进行数据交互
  • 优点:交互数据时不需要刷新,体验较好

WebSocket

  • 可以由服务端主动发起

二、XMLHttpRequest

GET 请求

  1. let url = 'https://api.github.com'
  2. let xhr = new XMLHttpRequest()
  3. xhr.open('GET',url,true)
  4. xhr.onreadystatechange = function(){
  5. if(xhr.readyState === 4){
  6. if((xhr.status>=200 && xhr.status<300) || xhr.status===304){
  7. console.log(JSON.parse(xhr.responseText))
  8. }else{
  9. console.log('服务器异常')
  10. }
  11. }
  12. }
  13. xhr.onerror = function(){
  14. console.log('网络异常')
  15. }
  16. xhr.send()

POST请求

  1. let url = 'https://xxx.com'
  2. let xhr = new XMLHttpRequest()
  3. xhr.time-3000
  4. xhr.open('POST',url,true)
  5. xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
  6. xhr.onload = function(){
  7. if((xhr.status>=200 && xhr.status<300) || xhr.status===304){
  8. console.log(JSON.parse.responseText)
  9. }else{
  10. console.log('响应异常')
  11. }
  12. }
  13. xhr.ontimeout = function(){console.log('请求超时')}
  14. xhr.onerror=function(){console.log('服务器异常')}
  15. xhr.send('username=hunger&password=12345678')

GET请求的封装

  1. const request = (url,params,onsuccess,onerror)=>{
  2. url = url + '?' + Object.entries(params).map(array=>array[0]+array[1]).join('&')
  3. let xhr = new XMLHttpRequest()
  4. xhr.open('GET',url,true)
  5. xhr.onload = function(){
  6. if((xhr.status>=200 && xhr.status<300) || xhr.staus === 304){
  7. onsuccess(JSON.parase(xhr.responseText))
  8. }else{
  9. onerror()
  10. }
  11. }
  12. xhr.onerror = onerror
  13. xhr.send()
  14. }
  15. request('https://api.github.com',{q:test},
  16. data=>{console.log('请求成功');console.log(data)},
  17. ()=>{console.log('接口异常')}
  18. )

Post请求编码方式:multipart/form-data

  1. let formData = new FormData()
  2. formData.append('username','Jack')
  3. formData.append('password','123456')
  4. let url = 'https://xxx.com'
  5. let xhr = new XMLHttpRequest()
  6. xhr.open('GET',url,true)
  7. xhr.onload = function(){
  8. if((xhr.status>=200 && xhr.status<300) || xhr.status===304){
  9. console.log(JSON.Parase(xhr.responseText))
  10. }else{
  11. console.log('接口异常')
  12. }
  13. }
  14. xhr.send(formData)

Post请求提交表单例子

  1. const $=s=>document.querySelector(s)
  2. const $submit = $('[type=submit]')
  3. const $form = $('form')
  4. const $msg = $('#msg')
  5. let url = 'https://xxx.com'
  6. $form.onsubmit = function(e){
  7. e.preventDefalut()
  8. // 这里校验
  9. let formData = new FormData($form)
  10. let xhr = new XMLHttpRequest()
  11. xhr.open('GET',url,true)
  12. xhr.onload = function(){
  13. if((xhr.status>=200 && xhr.status<300) || xhr.status===304){
  14. //console.log(JSON.Parase(xhr.responseText))
  15. let data = JSON.Parase(xhr.responseText)
  16. $msg.innerText = data.msg || data.errMsg
  17. }else{
  18. console.log('接口异常')
  19. }
  20. }
  21. xhr.send(formData)
  22. }

三、fetch

GET请求

  1. let url = 'https://api.github.com'
  2. fetch(url).then(response=>response.json())
  3. .then(data=>{console.log(data)})

POST请求

  1. let url = 'https://xxx.com'
  2. let data = {username:'Jack',password:123456}
  3. fetch(url,{
  4. method:'POST',
  5. body:Object.entries(data).map(array=>array[0]+'='+array[1]).join('&'),
  6. header:{'Content-Type':'application'/x-www-form-urlencoded}
  7. }).then(res=>res.json())
  8. .then(response=>console.log('Success:',response))
  9. .catch(error=>console.error('Error:',error))

四、轮询

Ajax轮询

  • 每个固定时间发一次请求
  • 发请求,立即响应

长轮询(Comet)

  • 客户端
    • 发请求,等待响应
    • 当响应时,再次发请求
  • 服务端
    • 请求到来,如果没新数据,则不发
    • 当有新数据,需要通知客户端,再响应

「@浪里淘沙的小法师」