在Google App Script中发送HEAD请求

7

我正在开发一个Google应用脚本,用于确定远程资源的大小而无需下载它。 代码如下:

function getRemoteFileSize()
{  
  var params =  { "method" : "head" };
  var resp = UrlFetchApp.fetch("https://www.google.com/images/srpr/logo11w.png", params);
  Logger.log("Remote File Size: " + resp.getAllHeaders()["Content-Length"]);
}

然而,Google App Script 似乎不支持 HEAD 请求,并且上述代码无法执行。
除了发出 GET 请求之外,还有什么可行的替代方案呢? 我愿意接受所有建议,包括使用具有 API 的第三方服务。

2
功能在2014年被要求。Bug在2017年被分配给某人。如果我们幸运的话,这个功能将会在2020年实现。:-) https://issuetracker.google.com/issues/36762291 - jcsahnwaldt Reinstate Monica
2个回答

6

您可以尝试通过设置 "headers" 高级参数来覆盖该方法:

var params = {"method" : "GET", "headers": {"X-HTTP-Method-Override": "HEAD"}};

我从未使用过"HEAD",所以我不能确定这个方法是否有效,但我已经使用了"PATCH"的方法覆盖,并且它是有效的。


它肯定是在工作,但我们如何确保它发出的是“HEAD”请求而不是“GET”请求呢? - Extreme Coders
你可以使用浏览器的开发者工具来查看网络请求。Chrome内置了开发者工具。你也可以在浏览器中添加FireBug插件。 - Alan Wells
1
我刚试了一下,不起作用。我通过向我可以访问的Apache Web服务器发送urlFetchApp请求并跟踪access.log进行测试。该请求仍然是GET方法。 - Jimadine
1
Downvote:对于大多数URL无效。据我所知,大多数HTTP服务器必须进行特殊配置才能使其工作。换句话说,如果您可以配置提供URL的服务器,则可能能够使其正常工作。否则,这将很难帮助到您。请参阅 https://www.hanselman.com/blog/HTTPPUTOrDELETENotAllowedUseXHTTPMethodOverrideForYourRESTServiceWithASPNETWebAPI.aspx(答案提到了PATCH,但要发送PATCH请求,可以使用`{method:“PATCH”}`。) - jcsahnwaldt Reinstate Monica

3
我发现在我的情况下,可以使用 Range 请求头来请求 0 字节,然后检查响应头部中保留的文件大小:
var params = {
    method: "GET",
    headers: {
      Range: "bytes=0-0",
    },
  };
  var response = UrlFetchApp.fetch(fileUrl,params);
  var headers = response.getHeaders();
  var fileSizeString = headers['Content-Range']
  var fileSize = +headers['Content-Range'].split("/")[1];

响应头中有一个值为 Content-Range=bytes 0-0/139046553 ,我可以使用它来转换为整数(139046553),表示字节数量。

至少它适用于由Google存储的文件(我尝试过来自Google Drive元素和存储在Google Cloud Storage中的图像)! - ValLeNain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接