其实不少面试问HTTP的3次握手,4次挥手,我以为价值不大,能够帮助你理解HTTP的原理,死背硬记的对于你开发没有做用,而是去理解它就行。
前端只关心URL、headers和data,接下来也围绕着它们展开。
了解HTTP请求能够看看:https://developer.mozilla.org...html
URL比较简单,就简单介绍一下,将URL分为主要的3部分:前端
告诉客户端,用什么形式前端的数据发送到后台:application/x-www-form-urlencoded、multipart/form-data、text/plain等。ios
最多见的方式以键值对的字符串传输(相似URL的search),但不能传输文件,几乎全部的ajax框架都是默认以此种方式发送。
发送到后台的数据见下图:面试
这种方式会以键值对的形式经过分隔符连接,以字符串给后台,能够传输文件,也能够传输普通数据。
经常使用场景:ajax
// 源生的form提交可设置enctype="multipart/form-data",通常表单中有文件会自动设为该值 <form action="post" enctype="multipart/form-data"></form> // ajax请求,经过formdata对象来达成此目的 const formdata = new new FormData(); formdata.append("key","value") $.ajax({ ... data: formdata, processData: false, // 取消对数据的预处理,由于formdata不须要预处理 headers: { "Content-Type": undefined // 客户端会自动给它设置正确的值,不要设为multipart/form-data,这样设的后果会致使分隔符不正确 }, ... })
若是在抓包确认划线的一致的话就是正确发送过去了。json
这个不多会用到了,普通文本,能够是任意数据,除了文件。axios
二进制流,仅限一个文件。后端
告诉后台你但愿返回什么类型的数据,如xml,html,script,json,jsonp,text等,或者你跟后台约定的也可。可是实际返回的并不是跟预期一致,仍是由后台决定的。跨域
若是跟后台有约定header,如token等,也可传到后台。浏览器
headers["token"] = "MD5KEY";
跨域问题的根本问题就是同源策略,旨在防止网站被攻击,这里不作赘述。
CORS是后台的工做,但前端工程师仍是要了解CORS,这样才有后台抬杠的资本。如下是后台response配置CORS的headers,若是后台不懂,请让他了解了解CORS。
简单说,容许跨域访问的host,必须设置,不然不容许跨域。
// 如需容许全部资源均可以访问您的资源,您能够如此设置:这很危险,建议仍是维护白名单。并且‘*’有局限性 Access-Control-Allow-Origin: * // 如需容许https://developer.mozilla.org访问您的资源,您能够设置: Access-Control-Allow-Origin: https://developer.mozilla.org, htto://10.10.1.12:8089
若是想跨域传输cookies,须要Access-Control-Allow-Credentials与XMLHttpRequest.withCredentials 或Fetch API中的Request() 构造器中的credentials 选项结合使用。Credentials必须在先后端都被配置(即the Access-Control-Allow-Credentials header 和 XHR 或Fetch request中都要配置)才能使带credentials的CORS请求成功。
// 客户端,以axios为例 axios.defaults.withCredentials = true // 服务端 rsponse.headers[Access-Control-Allow-Credentials] = true
容许跨域的请求的方法。
Access-Control-Allow-Methods: POST, GET, OPTIONS
response的header中Access-Control-Allow-Headers 用于 preflight request (即会在实际请求发送以前先发送一个option请求)中,列出了将会在正式请求的 Access-Control-Expose-Headers 字段中出现的首部信息。
简单首部,如 simple headers、Accept、Accept-Language、Content-Language、Content-Type (只限于解析后的值为 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 三种MIME类型(不包括参数)),它们始终是被支持的,不须要在这个首部特地列出。
不少人在抓包时会很郁闷怎么会无故端多出了一个OPTIONS请求,请不要奇怪,这只是CORS策略的预检请求,就像你要去跟别人借个东西,要先问问对方肯不愿同样。
简单的说,就是有自定义headers,Content-Type的值不属于下列之一:application/x-www-form-urlencoded,multipart/form-data,text/plain的请求会触发OPTIONS请求。若是产生OPTIONS请求,须要后台去响应它,容许它跨域。
https://www.jianshu.com/p/b55... 能够参考篇文章。
PS: 我主要使用Chrome的DevTools工具
不要相信你的代码,以抓包工具的为准!!!!!要相信若是抓包的数据有问题,那么就是你的代码有问题。
不要相信你的代码,以抓包工具的为准!!!!!要相信若是抓包的数据有问题,那么就是你的代码有问题。
不要相信你的代码,以抓包工具的为准!!!!!要相信若是抓包的数据有问题,那么就是你的代码有问题。
若是你确认你发送的数据没问题,那么该看看后台响应了什么,若是响应的数据有问题,那么是后台的责任。
若是是跨域的要查看有没有响应CORS的请求头。
若是你的代码出错,或者http错误,包括CORS错误,控制台会抛出错误,错误信息能够帮助你很快定位问题。
这里不会详细介绍DevTools,但你要学会使用DevTools,它会大大提升的调试效率。
HTTP STATUS