You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:43:14