目录
xml.setRequestHeader(name,value)
AJAX作用
- 不刷新页面更新网页。
- 在页面加载后从服务器请求数据。
- 在页面加载后从服务器接收数据。
- 在后台向服务器发送数据。
AJAX用法(文字介绍)
- 创建一个异步XMLHttpRequest对象。
- 设置请求方式和请求地址(open方法,需设置请求地址,请求方法get或者post,同步或异步)。
- 发送请求(send方法)。
- 监听状态的变化(通过监听事件onreadystatechange)。
- 处理返回的结果。
XMLHttpRequest方法
XMLHttpRequest()
通过var xml = new XMLHttpRequest()创建AJAX对象。IE5~IE6使用var xml = new ActiveXObject('Microsoft.XMLHTTP')。
xml.open(method, url, async)
设置请求方式和请求地址等,method为请求方式包括'get'和'post';url为请求文件地址(提交数据地址);async为设置请求是异步还是同步,一般只传true,为异步。
xml.setRequestHeader(name,value)
设置请求头中属性和值,一次只能设置一条(设置多条则写多条setRequestHeader语句),当post请求时,send中如果发送了数据,需要在send前,open后添加一条xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");发送的数据才会被正常解析。
xml.send(string)
当传入string时,xml发送post请求,string为post携带的数据,格式为key1=value1&key2=value2&....&keyn=valuen的字符串。
xml.getAllResponseHeaders()
返回所有的响应头信息。
xml.getResponseHeader(name)
返回响应头信息中的name属性的值。
xml.abort()
消失当前请求(xml中所有内容清空)。
XMLHttpRequest属性
xml.onreadystatechange
xml对象的状态改变事件即xml.readyState的改变。xml.readyState有5个值0~4,0:请求未初始化;1:服务器连接已建立;2:请求已收到;3:正在处理请求;4:请求已完成且响应已就绪;当状态位为4且xml.status>=200&&xml<300||xml.status===304时,我们才能接收到服务器的响应内容并做处理。
xml.status
响应状态码,为数字,不同数字代表了不同的xml.statusText,200:"OK";403:"Forbidden";404:"Not Found"等;
xml.statusText
响应状态码对应的文本。
xml.responseText
服务器返回前端的文本,为字符串,例如请求服务器中php文件,则该字符串为所有echo内容的连接;如果为txt文件,该字符串为txt的所有内容。
xml.responseXML
当服务器的返回数据为xml时,以此接收的是xml的根节点,类似#document,可以通过getElementsByTagName等方法获取需要内容。
AJAX实例
服务器端响应请求注意
- 注意在php执行结果有中文时,为防止乱码,需要添加header('content-type:text/html; charset=utf-8')。
- 如果php需要返回xml时,需要添加header('content-type:text/xml; charset=utf-8')。
- php中通过echo file_get_contents(filename:url)返回xml文件,其中参数为url,代表返回xml文件的地址。
GET请求和POST请求
GET请求
发送数据存储位置
通过把数据携带在url地址中,例如url='get请求_百度搜索',其中https://www.baidu.com/s之后的为get提交的数据,以?连接。
我们也可以在控制台中查看,如下图所示,打开我们的控制台中的Network,找到我们请求发送数据的地址,图中为hello.php,?后面连接的就是数据,然后在Headers请求头中最下面Query String Parameters也是我们发送的数据,图中为userPwd:aaa。
注意和要求
- 大小要求小于2000字符。
- 不用于发送敏感信息(发送信息暴露在url地址中)。
- php中以$_GET接收。
- IE浏览器中的get请求,浏览器认为同一个url只有同一个结果即多次请求同一个url地址会拿到同一个内容(不是实时的),通常我们在url后面添加数据来保证url不同,来确保每次拿到实时数据,比如添加t=Date.now()。
POST请求
发送数据存储位置
存储在请求头中,如图所示,打开我们的控制台中的Network,找到我们请求发送数据的地址,图中为hello.php,在Headers请求头中最下面Form Data为我们发送的数据内容,图中为userPwd:jj。
注意和要求
- 无大小要求。
- 常用于发送敏感数据。
- php中以$_POST接收。
- HTML表单的默认编码类型为enctype='application/x-www-form-urlencoded',当传递文件(图片)时,需要改为enctype='multipart/form-data',而且在php中要以$_FILES接收,上传的文件会保存在tmp文件夹中,该文件夹为临时文件夹,如果间隔一段时间未使用,会自动清空该文件夹中内容(所以一般查看不到接收的文件),只有通过move_uploaded_file($originPath,$targetPath)转移文件地址,$originPath代表原来接收的地址,$targetPath代表新接收地址,这些地址是包含了接收文件的文件名的。
- 通过软件搭建的服务器一般设置有限制post请求大小、请求时长等。例如Wampserver软件,我们需要在安装的文件夹下的\bin\apache\apache2.4.37\bin\的php.ini文件,用编程工具打开修改以下内容为想要的大小,然后重启该软件。
file_uploads=On
<!-- 上传文件开关 -->
upload_max_filesize = 2M
<!-- 最大上传文件大小 -->
post_max_size = 2M
<!-- post请求上传文件最大大小 -->
max_execution_time=1000
<!-- 最长执行事件 -->
max_input_time = 1000
<!-- 提交数据时间限制 -->
memory_limit=128M
<!-- 最大内存消耗 -->
区别总结
- GET在浏览器回退时是无害的,而POST会再次提交请求
- GET产生的UR地址可以被收藏,而POST不可以
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置
- GET请求只能进行ur|编码,而POST支持多种编码方式
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- GET请求在URL中传送的参数是有长度限制的,而POST没有限制
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
- GET参数通过URL传递,POST放在Request body中 。
url
url组成结构
url为打开网页的完全的地址,例如(未包括get请求的数据,后连接?key1=value1&key2=value2&....&keyn=valuen)AJAX - XMLHttpRequest 对象,其中包括ip地址为https://www.w3school.com.cn/,ip地址是从后往前看,cn代表china,com代表商业网站,它域名为w3school。注意HTML表单和JavaScript的方法中提交的url只要不是以https://开头的,它请求的地址都会是当前打开的网页的ip地址拼接提交的url,而不是重新打开一个url。url包括ip地址和服务器下文件的地址,例中为/js/js_ajax_http.asp。
跨域问题
由于安全问题,浏览器禁止跨域访问,例如https://www.w3school.com.cn/js/js_ajax_http.asp这个网站的异步AJAX请求只能访问,该服务器下的文件内容https://www.w3school.com.cn/下内容即同一台服务器的内容(同一ip地址)。
如何解决跨域
encodeURIComponent(str)
注意URL中不能出现中文,我们可以通过encodeURIComponent(str),将str转换为符合要求的字符串。
JSON
JavaScript 对象表示法(JavaScript Object Notation)。
JSON.parse(str)
将类似于对象的字符串str转化为对象返回。例如str='{"name":"Bill Gates", "age":62, "city":"Seattle"}'通过该方法能转化为对象{"name":"Bill Gates", "age":62, "city":"Seattle"}。注意str的写法上属性要带有引号。
JSON.stringify(obj)
将对象obj转化为类似于对象的字符串返回。例如obj={"name":"Bill Gates", "age":62, "city":"Seattle"}通过该方法能转化为字符串'{"name":"Bill Gates", "age":62, "city":"Seattle"}'。注意obj即使属性上定义时不带引号,返回的类似对象的字符串上的属性也带有引号。