AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(二)

简介: AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)(二)

8. 发送POST请求

服务端:

// 导入express
const express = require('express')
// 创建应用对象
const app = express()
// 创建路由对象
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/', (request, response) => {
  //设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 向客户端发送数据
  response.send('Hello AJAX')
})
app.post('/', (request, response) => {
  //设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 向客户端发送数据
  response.send('Hello AJAX POST')
})
// 启动服务器进行监听
// 8000 端口 服务端在8000端口监听客户端向8000端口发送过来的请求
app.listen(8000, () => {
  console.log('服务端在8000端口监听')
})
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #result {
        width: 200px;
        height: 100px;
        border: solid 1px #90b;
      }
    </style>
  </head>
  <body>
    <button>发送POST请求</button>
    <div id="result"></div>
    <script>
      // 获取按钮
      const btn = document.querySelector('button')
      // 获取div
      const div = document.querySelector('div')
      // 绑定事件
      btn.addEventListener('click', function () {
        // 创建发送AJAX请求的对象
        const xhr = new XMLHttpRequest()
        // 初始化 设置请求的方法和url
        xhr.open('POST', 'http://127.0.0.1:8000/')
        // 发送请求
        xhr.send()
        // 处理返回的数据
        xhr.onreadystatechange = function () {
          // 服务端返回了所有的结果
          if (xhr.readyState === 4) {
            // 响应状态码 2xx 为成功
            if (xhr.status >= 200 && xhr.status < 300) {
              // 设置div中的文本
              div.innerHTML = xhr.response
            }
          }
        }
      })
    </script>
  </body>
</html>

8.1 POST设置请求体

在xhr.send()中设置,可以设置任意类型任意格式的数据

// 绑定事件
      btn.addEventListener('click', function () {
        // 创建发送AJAX请求的对象
        const xhr = new XMLHttpRequest()
        // 初始化 设置请求的方法和url
        xhr.open('POST', 'http://127.0.0.1:8000/')
        // 发送请求
        xhr.send('name=zs&age=12')
        ...
      })

8.2 设置请求头

在open方法后进行添加 xhr.setRequestHeader()进行设置

// 绑定事件
      btn.addEventListener('click', function () {
        // 创建发送AJAX请求的对象
        const xhr = new XMLHttpRequest()
        // 初始化 设置请求的方法和url
        xhr.open('POST', 'http://127.0.0.1:8000/')
        //设置请求头
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        // 发送请求
        xhr.send('name=zs&age=12')
        ...
      })

9. 服务端响应JSON格式的数据

// 导入express
const express = require('express')
// 创建应用对象
const app = express()
// 创建路由对象
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/', (request, response) => {
  //设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 向客户端发送数据
  response.send('Hello AJAX')
})
app.post('/', (request, response) => {
  //设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 向客户端发送数据
  response.send('Hello AJAX POST')
})
app.get('/json', (request, response) => {
  //设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  const data = {
    name: 'zs',
    age: 12
  }
  // 对对象进行字符串转换
  let str = JSON.stringify(data)
  // 向客户端发送数据
  response.send(str)
})
// 启动服务器进行监听
// 8000 端口 服务端在8000端口监听客户端向8000端口发送过来的请求
app.listen(8000, () => {
  console.log('服务端在8000端口监听')
})
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #result {
        width: 200px;
        height: 100px;
        border: solid 1px #90b;
      }
    </style>
  </head>
  <body>
    <button>发送GET请求JSON数据</button>
    <div id="result"></div>
    <script>
      // 获取按钮
      const btn = document.querySelector('button')
      // 获取div
      const div = document.querySelector('div')
      // 绑定事件
      btn.addEventListener('click', function () {
        // 创建发送AJAX请求的对象
        const xhr = new XMLHttpRequest()
        // 初始化 设置请求的方法和url
        xhr.open('GET', 'http://127.0.0.1:8000/json')
        // 发送请求
        xhr.send()
        // 处理返回的数据
        xhr.onreadystatechange = function () {
          // 服务端返回了所有的结果
          if (xhr.readyState === 4) {
            // 响应状态码 2xx 为成功
            if (xhr.status >= 200 && xhr.status < 300) {
              // 设置div中的文本
              div.innerHTML = xhr.response
              console.log(xhr.response)
              // 手动对数据进行转化
              console.log(JSON.parse(xhr.response))
            }
          }
        }
      })
    </script>
  </body>
</html>

9.1 服务端返回的JSON自动转化

设置:

// 设置响应体数据的类型
        xhr.responseType = 'json'
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #result {
        width: 200px;
        height: 100px;
        border: solid 1px #90b;
      }
    </style>
  </head>
  <body>
    <button>发送GET请求JSON数据</button>
    <div id="result"></div>
    <script>
      // 获取按钮
      const btn = document.querySelector('button')
      // 获取div
      const div = document.querySelector('div')
      // 绑定事件
      btn.addEventListener('click', function () {
        // 创建发送AJAX请求的对象
        const xhr = new XMLHttpRequest()
        // 设置响应体数据的类型
        xhr.responseType = 'json'
        // 初始化 设置请求的方法和url
        xhr.open('GET', 'http://127.0.0.1:8000/json')
        // 发送请求
        xhr.send()
        // 处理返回的数据
        xhr.onreadystatechange = function () {
          // 服务端返回了所有的结果
          if (xhr.readyState === 4) {
            // 响应状态码 2xx 为成功
            if (xhr.status >= 200 && xhr.status < 300) {
              // 设置div中的文本
              div.innerHTML = xhr.response
              console.log(xhr.response)
              // 手动对数据进行转化
              // console.log(JSON.parse(xhr.response))
            }
          }
        }
      })
    </script>
  </body>
</html>

10. nodemon

【Express】

11. 解决 IE 缓存问题

在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩 余多次请求不会在发送给浏览器而是直接加载缓存中的数据。

解决方式:

浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址 即可避免缓存问题。

在请求url后添加?t='+Date.now()

将原来的请求地址:

xhr.open( 'GET', 'http://127.0.0.1:8000/ie' )

修改为:

xhr.open("GET",'http://127.0.0.1:8000/ie?t='+Date.now())

由于每次的请求时间不一样,产生的时间戳不一样,所以每次发起的请求url都不同。

<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');
        btn.addEventListener('click', function(){
            const xhr = new XMLHttpRequest();
            xhr.open("GET",'http://127.0.0.1:8000/ie?t='+Date.now());
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status< 300){
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>

相关文章
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
512 1
|
人工智能 前端开发 JavaScript
webpack-dev-server代理后端一直报CORS跨域或500错误
在Vue项目中使用Webpack的devServer代理后端接口时,遇到500错误。问题根源在于浏览器请求中携带的Origin头导致服务器报错,而Postman测试正常。通过分析发现,调整或移除Origin头可解决问题。解决办法包括:1) 在代理配置中添加正确的Origin头;2) 删除请求中的Origin头。文章还深入解析了Origin头的作用及changeOrigin配置的实际意义,并附带相关文档链接,帮助开发者更好地理解与解决类似跨域问题。
1131 20
|
安全 API PHP
PHP中实现CORS跨域资源共享的方法
通过这种方式,你可以在PHP应用中灵活地实现CORS,以支持跨域Web应用的需求。
850 15
|
前端开发 JavaScript 应用服务中间件
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
跨域问题是前端开发中常见且棘手的问题,但通过理解CORS的工作原理并应用合适的解决方案,如服务器设置CORS头、使用JSONP、代理服务器、Nginx配置和浏览器插件,可以有效地解决这些问题。选择合适的方法可以确保应用的安全性和稳定性,并提升用户体验。
10043 90
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
JSON 缓存 前端开发
对CORS(跨域)的一些见解
CORS(跨域资源共享)是W3C标准,用于解决AJAX跨源请求限制。浏览器与服务器需共同支持CORS,浏览器自动处理请求头,开发者无需额外操作。CORS分为简单请求与非简单请求:简单请求满足特定条件(如方法为GET/POST/HEAD且头信息有限制),浏览器直接发送;非简单请求需先进行“预检”请求(OPTIONS方法),确认服务器允许后才发送实际请求。服务器回应需包含Access-Control-Allow-Origin等字段,以控制跨域访问权限。
525 10
|
JSON 前端开发 JavaScript
Python中如何判断是否为AJAX请求
AJAX请求是Web开发中常见的异步数据交互方式,允许不重新加载页面即与服务器通信。在Python的Django和Flask框架中,判断AJAX请求可通过检查请求头中的`X-Requested-With`字段实现。Django提供`request.is_ajax()`方法,Flask则需手动检查该头部。本文详解这两种框架的实现方法,并附带代码示例,涵盖安全性、兼容性、调试及前端配合等内容,帮助开发者提升Web应用性能与用户体验。
511 0
|
资源调度 JavaScript
|
JavaScript 前端开发
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
JavaScript 前端开发
【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?
文章讨论了Vue项目目录结构的设计原则和实践,强调了项目结构清晰的重要性,提出了包括语义一致性、单一入口/出口、就近原则、公共文件的绝对路径引用等原则,并展示了单页面和多页面Vue项目的目录结构示例。