【问题标题】:Need to get statuses of static files需要获取静态文件的状态
【发布时间】:2020-03-24 09:40:08
【问题描述】:

我需要获取页面上静态文件的状态(http 代码)。

例如html代码包含

<link rel="stylesheet" type="text/css" href="theme.css">
<link rel="stylesheet" type="text/css" href="https://example.com/theme.css">
<script src="script.js"></script>
<script src="https://example.com/script.js"></script>
<img src="image.png">
<img src="https://example.com/image.png">

在输出上需要得到这样的json 只需要 404。

{
  "css": [
    {
      "https://example.com/theme.css": "404",
      "https://example2.com/theme.css": "404"
    }
  ],
    "js": [
    {
      "https://example1.com/script.js": "404",
      "https://example.com/script.js": "404"
    }
  ],
      "images": [
    {
      "https://example.com/image.png": "404",
      "https://example.com/image.png": "404"
    }
  ]
}

必须只使用 Javascript。

我会用这个

var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
        callback(xmlHttp.responseText);
}
xmlHttp.open("GET", theUrl, true); // true for asynchronous
xmlHttp.send(null);

有必要在收到状态后,不应该通过对文件执行单独的 GET 请求来完成。

但如果不执行单独的 GET 请求,我无法找到方法。

谁能找到解决办法?

【问题讨论】:

    标签: javascript html css request xmlhttprequest


    【解决方案1】:

    我需要在这里做一些假设,所以请检查这些假设是否正确:-)

    • 您希望在浏览器中运行代码(即不在 Electron 或 Node.js 或 Web 扩展中)。
    • 您希望节省额外的网络往返(例如,不发出额外的请求来丢弃响应,因为您只需要状态)。
    • 您希望进一步处理结果。
    • 您要求插入 HTML 中的静态文件(而不是注入 JavaScript)。

    恐怕你不会有太多时间提出额外的请求。

    这里有一些想法,您可以进一步调查:

    • 发出额外的HEAD 请求而不是GET
      • 这只会询问 HTTP 标头(正文将为空)。
      • 遗憾的是,并非所有服务器都支持它。
    • 使用Service Worker to intercept the network requests 并在将响应转发到浏览器之前查看状态代码。
      • 我不能告诉你,如何从服务人员那里获得响应。
    • 尽早注册您的 JavaScript 并 intercept the requests,即直接在 JavaScript 中处理它们。
      • 不适用于 HTML 中链接的静态资源

    如果您能提供有关您正在尝试做的事情的更多详细信息,那就太好了。

    干杯

    龙野纪

    【讨论】:

      【解决方案2】:

      如果您正在使用像 PHP 这样的服务器端语言,那么我有一些想法。例如。

      <?php
      $url= $_POST["url"];
      $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_NOBODY => true)); $header = explode("\n", curl_exec($curl)); curl_close($curl); $string = $header[0];
      if(strpos($string, "200")){
          echo "200";
      }else{
          echo "404";
      }
      ?>
      

      url参数在AJAX中调用上述文件。

      或者在你的服务器端写类似行。喜欢(python):

      s=socket.socket()
      s.connect('url',80)
      s.send('GET /path HTTP/1.0\r\nHost:hostname\r\n\r\n')
      print s.recv(1024) #some lines of headers
      

      综上所述,简而言之,如果不发送request,就无法获取任何主机中存在的文件的status code

      因此,不发送多个 AJAX 请求(单独的 GET 请求)是不可能的

      【讨论】:

      • 如果这样,你能不使用“GET”请求解决这个问题吗?有没有其他不使用“GET”请求的方法?
      • 但是,如何在不向包含服务器的文件发送任何请求的情况下检查文件是否存在?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多