本文详细介绍了网络请求的基础知识,包括GET和POST请求的区别、如何处理跨域请求等,并提供了大量的示例代码供读者理解和实践。此外,文章还总结了网络请求面试中可能遇到的问题和最佳实践,帮助读者应对网络请求面试题。
网络请求基础知识网络请求是客户端(如浏览器)与服务器之间传递数据的过程。服务器接收客户端的请求,根据请求的内容处理数据,并返回给客户端。常见的网络请求方式有HTTP请求、HTTPS请求等。
网络请求主要可以分为两大类:GET请求和POST请求。
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://example.com/data?param1=value1¶m2=value2", true); xhr.onload = function() { if (this.status == 200) { console.log(this.response); } }; xhr.send();
var xhr = new XMLHttpRequest(); xhr.open("POST", "https://example.com/data", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onload = function() { if (this.status == 200) { console.log(this.response); } }; xhr.send("param1=value1¶m2=value2");
跨域请求是指浏览器由于同源策略限制,无法直接从一个域向另一个域发起请求。常见的解决方法有CORS(跨源资源共享)、JSONP(JSON with Padding)等。
//服务器端设置 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Allow-Headers: Content-Type, Authorization
//客户端请求
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://otherdomain.com/data", true);
xhr.onload = function() {
if (this.status == 200) {
console.log(this.response);
}
};
xhr.send();
#### JSONP - **特点**: JSONP是一种通过`<script>`标签来实现跨域请求的方法,只支持GET请求。 - **示例**: ```javascript //服务器端数据格式 <script> callbackFunction({"name": "John", "age": 30}); </script> //客户端请求 <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://otherdomain.com/data?callback=callbackFunction"></script> function callbackFunction(data) { console.log(data); }
AJAX(Asynchronous JavaScript and XML)是一种在不重载整个网页的情况下,能够更新部分网页的技术。它通过XMLHttpRequest
对象在后台与服务器进行异步数据交换,不会导致整个页面刷新或重启。
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://example.com/data", true); xhr.onload = function() { if (this.status == 200) { var data = JSON.parse(this.responseText); console.log(data); } }; xhr.send();
实现一个简单的 GET 请求,请求一个API并解析响应数据。
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data", true); xhr.onload = function() { if (this.status == 200) { var data = JSON.parse(this.responseText); console.log(data); } }; xhr.send();
实现一个简单的 POST 请求,向服务器提交数据并处理响应。
var xhr = new XMLHttpRequest(); xhr.open("POST", "https://api.example.com/data", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onload = function() { if (this.status == 200) { console.log(this.response); } }; xhr.send(JSON.stringify({ "key": "value" }));
跨域问题是网络请求中常见的问题,可以通过以下几种方法解决:
Access-Control-Allow-Origin
。<script>
标签实现跨域请求。//客户端代码 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://localhost:3000/proxy?url=https://api.example.com/data", true); xhr.onload = function() { if (this.status == 200) { var data = JSON.parse(this.responseText); console.log(data); } }; xhr.send();
//代理服务器代码 var http = require('http'); var url = require('url'); var httpProxy = require('http-proxy'); var options = { target: 'https://api.example.com', changeOrigin: true }; var proxy = httpProxy.createProxyServer(options); http.createServer(function (req, res) { var parsedUrl = url.parse(req.url, true); var proxyUrl = parsedUrl.query.url; if(proxyUrl) { proxy.web(req, res, {target: proxyUrl}); } else { res.writeHead(400); res.end('Bad request'); } }).listen(3000);网络请求面试中可能遇到的陷阱
什么是HTTP状态码:
// 处理HTTP状态码示例 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://example.com/data", true); xhr.onload = function() { if (this.status === 200) { console.log('请求成功'); } else if (this.status === 400) { console.log('请求错误'); } else if (this.status === 403) { console.log('禁止访问'); } else if (this.status === 404) { console.log('资源未找到'); } else if (this.status === 500) { console.log('服务器内部错误'); } }; xhr.send();
什么是HTTP缓存:
HTTP缓存可以提高网站的加载速度和减少服务器负载。通过设置响应头 Cache-Control
和 Expires
,可以控制资源的缓存策略。
// 设置HTTP缓存示例 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://example.com/data", true); xhr.setRequestHeader("Cache-Control", "max-age=3600"); xhr.setRequestHeader("Expires", new Date(Date.now() + 3600000).toUTCString()); xhr.onload = function() { if (this.status === 200) { console.log(this.response); } }; xhr.send();
异步问题: 注意异步操作的顺序和错误处理。
// 避免跨域错误的示例 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data", true); xhr.withCredentials = true; // 设置跨域请求时携带凭证 xhr.onload = function() { if (this.status === 200) { console.log(this.response); } }; xhr.send();
// 避免异步问题的示例 var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data", true); xhr.onload = function() { if (this.status === 200) { console.log('异步请求成功'); } else { console.log('异步请求失败'); } }; xhr.onerror = function() { console.log('请求出错'); }; xhr.send();
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data1,data2", true); xhr.onload = function() { if (this.status == 200) { var data = JSON.parse(this.responseText); console.log(data); } }; xhr.send();
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.example.com/data", true); xhr.onload = function() { if (this.status == 200) { console.log(this.response); } }; xhr.send();总结与复习
XMLHttpRequest
对象进行异步数据交换。XMLHttpRequest
对象发起GET请求。XMLHttpRequest
对象发起POST请求。通过以上内容,你应该能够更好地理解和掌握网络请求的相关知识,为面试做好充分准备。