前言

最近与后端联调,后端问能不能发送get请求时,把请求参数放入请求体中,HTTP GET 请求在请求体中带参数的问题

ajax介绍

AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。

function success(text) {
    var textarea = document.getElementById('test-response-text');
    textarea.value = text;
}

function fail(code) {
    var textarea = document.getElementById('test-response-text');
    textarea.value = 'Error code: ' + code;
}

var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象

request.onreadystatechange = function () { // 状态发生变化时,函数被回调
    if (request.readyState === 4) { // 成功完成
        // 判断响应结果:
        if (request.status === 200) {
            // 成功,通过responseText拿到响应的文本:
            return success(request.responseText);
        } else {
            // 失败,根据响应码判断失败原因:
            return fail(request.status);
        }
    } else {
        // HTTP请求还在继续...
    }
}

// 发送请求:
request.open('GET','/api/categories');
request.send();

alert('请求已发送,请等待响应...');

XMLHttpRequest对象

Attributes

参数 类型 描述
onreadystatechange Function 一个JavaScript函数对象,当readyState属性改变时会调用它。回调函数会在user interface线程中调用
readyState unsigned short 5种状态
response varies 响应实体的类型由 responseType 来指定, 可以是 ArrayBuffer, Blob, Document, JavaScript 对象 (即 "json"), 或者是字符串。如果请求未完成或失败,则该值为 null。
responseType DOMString 设置该值能够改变响应类型。就是告诉服务器你期望的响应格式。1."" (空字符串) 2."arraybuffer"(ArrayBuffer) 3."blob"(Blob)4."document"(Document)5."json"(JavaScript 对象,解析自服务器传递回来的JSON 字符串。) 6."text" (字符串)
responseXML responseXML Document? 本次请求的响应是一个 Document 对象,如果是以下情况则值为 null:请求未成功,请求未发送,或响应无法被解析成 XML 或 HTML。当响应为text/xml 流时会被解析。当 responseType 设置为"document",并且请求为异步的,则响应会被当做 text/html 流来解析。只读. 注意: 如果服务器不支持 text/xml Content-Type 头,你可以使用 overrideMimeType() 强制 XMLHttpRequest 将响应解析为 XML。
status unsigned short 该请求的响应状态码 (例如,状态码200 表示一个成功的请求).只读.
statusText DOMString 可以在 upload 上添加一个事件监听来跟踪上传过程。
withCredentials boolean 表明在进行跨站(cross-site)的访问控制(Access-Control)请求时,是否使用认证信息(例如cookie或授权的header)。 默认为 false。注意: 这不会影响同站(same-site)请求.
// 现代浏览器
  var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象

XHR用法

使用XHR对象时, 要调用的第一个方法是open(),接受3个参数("get","post" ....),请求的地址url, 表示是否异步发送请求的布尔值。

xhr.open('get','/advTest',false); // 并不会真正发送请求,而只是启动一个请求以备发送

跨域相关

要发送特定请求 需要调用send()方法:

xhr.open('get',false); // 并不会真正发送请求,而只是启动一个请求以备发送
  xhr.send(null);

xhr.send(null) send()方法必须接收一个参数,即要作为请求主体发送的数据,如果不需要发送则必须发送null,因为这个参数对浏览来说是必须的。调用send()之后请求被发送至服务器。

同步

当第三个为false时发送同步请求,JavaScript代码会等到服务器响应之后在继续执行。
当收到响应后,响应的数据会自动填充XHR对象的属性,相关属性如下

  • responseText: 作为响应主体被返回的文本
  • responseXML: 如果响应的内容是 "text/xml" 或 "application/xml",则这个属性中将保存包含着响应数据的XML DOM 文档。
  • status: 响应的HTTP状态
  • statusText: HTTP状态说明。

异步

同布发送请求当然没有问题,但多数情况下, 我们还是要发送异步请求,才能让js继续执行而不必等待响应。可通过检测readyState变化

request.onreadystatechange = function () { // 状态发生变化时,函数被回调
    if (request.readyState === 4) { // 成功完成
        // 判断响应结果:
        if (request.status === 200) {
            // 成功,通过responseText拿到响应的文本:
            return success(request.responseText);
        } else {
            // 失败,根据响应码判断失败原因:
            return fail(request.status);
        }
    } else {
        // HTTP请求还在继续...
    }
}

readyState当前请求的活动阶段。

  • 0: 请求未开始。 未调用open();
  • 1: 启动。 调用open()方法,但未调用send()方法。
  • 2:发送。 调用send()方法,但尚未收到响应。
  • 3:接收。 收到部分响应数据。
  • 4:完成。 收到全部响应数据,可在客户端使用。

xhr.abort(); -> xhr停止触发XHR对象

HTTP头部信息

每个http请求和响应都会带有相应的头部。

  • Accept: 浏览器能处理的内容类型
  • Cookie: 单前页面设置的任何Cookie
  • Host: 发出请求的页面所在的域
  • Referer: 请求页面发出的URL
  • User-Agent:浏览器用户代理字符串
    等等。。。

自定义请求头 需在open()以后,send()之前发送。

xhr.open('GET','/api/categories');
// 自定义请求头部信息
xhr.setRequextHeader('myHeader','myValue');
xhr.send();

getResponseHeader('XX') 获取请求头中特定字段
getAllResponseHeader('XX') 获取请求头中所有字段

GET请求

GET请求常用于向服务器查询信息。添加请求参数于url之后。 对于传入open()方法的URL末尾的查询字符的名称和值必须使用encodeURLComponent() 进行编码。

xhr.open('get','test.PHP?name=程心&age=24&other=AA',true); // 准备异步请求
// 添加参数工具方法
fucntion addURLParams(url,name,value) {
  url += (url.index('?') == -1 ? '?' : '&');
  url += encodeURLComponent(name) + '=' + encodeURLComponent(value);
  return url; 
}

POST请求

POST常用于向服务器发送需要保存的请求。 POST请求应该将数据作为请求体的主体提交,而GET传统上不是这样

GET POST区别

// post
xhr.open('GET','/api/categories');
// 自定义请求头部信息
xhr.setRequextHeader('Content-Type','application/x-www-form-urlencoded');
var from = document.getElementById('user-info');
xhr.send(serialize(from));
xhr.send();

POST 消耗的资源更多, GET最快达到POST的2倍。get url长度有限制

XMLHttpRequest 2级

规范化的XMLHttpRequest

FromData

序列化表单以及创建与表单格式相同的数据

var data = new FromData();
  data.append('name','云天明');

超时设定

XHR对象 timeout属性,表示请求在等待响应多久之后停止

xhr.timeout = 1000;
xhr.ontimeout = function() {
    console.log('超时了。。')
}

overrideMimeType() 方法

overrideMimeType() 用于重写MIME类型。

总结

由于这个疑问,借此重新学习了下ajax。url在请求头的Referer中故get请求在请求体中。

参考

HTTP请求行、请求头、请求体详解
XMLHttpRequest

了解XMLHttpRequest的更多相关文章

  1. AJAX在不同浏览器中XMLHttpRequest对象的生成示例

    本文为大家介绍下AJAX在不同浏览器中XMLHttpRequest对象是怎样生成的,以方便我们针对不同浏览器进行测试,感兴趣的朋友可以参考下,希望对大家有所帮助

  2. JSONP之我见

    本文主要向大家介绍了个人对于jsonp的理解,jsonp的概念,跨域问题,以及jsonp与XMLHttpRequest的区别,由于本人也是javascript的初学者,难免会有些不当之处,还请指正,谢谢。

  3. javascript XMLHttpRequest对象全面剖析

    通过不必把Web页面寄送到服务器而实现数据传送,XMLHttpRequest对象为客户端与服务器之间提供了一种动态的交互能力。

  4. 使用Ajax技术通过XMLHttpRequest对象完成首页登录功能

    这篇文章主要介绍了使用Ajax技术通过XMLHttpRequest对象完成首页登录功能,很不错的尝试,需要的朋友可以参考下

  5. JSP XMLHttpRequest动态无刷新及其中文乱码处理

    最近用到了XMLHttpRequest 动态无刷新技术 不刷新当前页面发送请求,并得到返回结果 主要是jsp页面内的js与后台的servlet交互,返回值为文本~~~

  6. 解析ajax核心XMLHTTPRequest对象的创建与浏览器的兼容问题

    这篇文章主要介绍了ajax核心XMLHTTPRequest对象的创建与浏览器的兼容问题。需要的朋友可以过来参考下,希望对大家有所帮助

  7. Ajax核心XMLHttpRequest总结

    本文主要是给大家总结了一下Ajax的核心内容XMLHttpRequest的相关知识,十分的详细,推荐给大家,需要的小伙伴参考下。

  8. 不使用XMLHttpRequest对象实现Ajax效果的方法小结

    这篇文章主要介绍了不使用XMLHttpRequest对象实现Ajax效果的方法,结合具体实例形式分析了三种不使用XMLHttpRequest对象实现Ajax功能的相关实现技巧与操作注意事项,需要的朋友可以参考下

  9. javascript对XMLHttpRequest异步请求的面向对象封装

    对XMLHttpRequest异步请求的面向对象封装,需要的朋友可以参考下。

  10. Html5 new XMLHttpRequest()监听附件上传进度

    这篇文章主要介绍了Html5 new XMLHttpRequest()监听附件上传进度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到<input>中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部