PHP CURL转XMLHttpRequest:三个参数的等价配置咨询
PHP CURL转XMLHttpRequest:三个参数的对应实现
你已经完成了PHP CURL POST请求到XMLHttpRequest的基础转换,下面针对剩余三个CURL参数的对应实现逐一说明:
1. CURLOPT_MAXREDIRS(最大重定向次数10)
XMLHttpRequest没有直接设置重定向次数的原生API,浏览器会自动处理重定向逻辑。如果需要精确控制最多10次重定向,得手动监听3xx状态码并计数:
var redirectCount = 0; var maxRedirects = 10; function sendRequest(url, transaction) { var xhr = new XMLHttpRequest(); xhr.responseType = 'json'; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.setRequestHeader('Connection', 'keep-live'); xhr.onreadystatechange = function() { // 检测到重定向响应 if (xhr.readyState === 3 && xhr.status >= 300 && xhr.status < 400) { redirectCount++; if (redirectCount > maxRedirects) { xhr.abort(); console.error("超过最大重定向次数"); return; } // 获取重定向地址并重新发送请求 var newUrl = xhr.getResponseHeader('Location'); sendRequest(newUrl, transaction); } else if (xhr.readyState === 4) { // 处理最终响应结果 if (xhr.status === 200) { console.log(xhr.response); } } }; xhr.send(transaction); } // 启动请求 sendRequest(url, transaction);
如果不需要精确控制到10次,依赖浏览器默认的重定向限制(通常5-20次)即可,无需额外代码。
2. CURLOPT_TIMEOUT(超时时间30秒)
XMLHttpRequest提供了timeout属性,直接设置为毫秒值(30秒=30000毫秒),同时可以监听ontimeout事件处理超时场景:
var xhr = new XMLHttpRequest(); xhr.responseType = 'json'; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.setRequestHeader('Connection', 'keep-live'); // 设置30秒超时 xhr.timeout = 30000; // 超时回调 xhr.ontimeout = function() { console.error("请求超时"); xhr.abort(); }; xhr.onreadystatechange = function() { if (xhr.readyState === 4) { // 处理响应 } }; xhr.send(transaction);
3. CURLOPT_HTTP_VERSION_1_1(指定HTTP/1.1版本)
XMLHttpRequest没有原生API强制指定HTTP版本,现代浏览器默认会和服务器协商使用HTTP/1.1或更高版本(如HTTP/2)。如果服务器仅支持HTTP/1.1,浏览器会自动降级适配,无需额外配置。目前没有可靠的方法通过XMLHttpRequest强制锁定HTTP/1.1,依赖浏览器的默认协商机制即可。
整合后的完整代码
结合以上处理逻辑,完整的XMLHttpRequest代码如下:
var redirectCount = 0; var maxRedirects = 10; function sendRequest(url, transaction) { var xhr = new XMLHttpRequest(); xhr.responseType = 'json'; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.setRequestHeader('Connection', 'keep-live'); // 设置30秒超时 xhr.timeout = 30000; xhr.ontimeout = function() { console.error("请求超时"); xhr.abort(); }; xhr.onreadystatechange = function() { if (xhr.readyState === 3 && xhr.status >= 300 && xhr.status < 400) { redirectCount++; if (redirectCount > maxRedirects) { xhr.abort(); console.error("超过最大重定向次数"); return; } var newUrl = xhr.getResponseHeader('Location'); sendRequest(newUrl, transaction); } else if (xhr.readyState === 4) { if (xhr.status === 200) { console.log("请求成功", xhr.response); } else { console.error("请求失败", xhr.status); } } }; xhr.send(transaction); } // 启动请求 sendRequest(url, transaction);
内容的提问来源于stack exchange,提问作者Lidya
相关产品推荐
相关产品推荐

