如何使用 fetch() 从请求中获取响应的内容长度

2024-02-15

我返回时遇到错误response.json()当我使用空响应主体执行请求时,因此我尝试在存在空主体时仅返回一个空对象。我想要的方法是检查Content-Length然而,响应的标题response.headers.get('Content-Length')以某种方式返回null。这是我的代码:

function fetchJSON(url, options, state = null) {
    return fetch(url, Object.assign({}, options, {
            // TODO: Add options here that should be there for every API call
            // TODO: Add token if there is one
        }))
        .then(response => {
            // Pass the JSON formatted body to the next handler
            if (response.ok === true) {
                if (response.headers.get('Content-Length') === 0) return {};
                return response.json();
            }

            // If the response was not an 2xx code, throw the appropriate error
            if (response.status === 401) throw new AuthorizationError("You are not authorized to perform this action");

            // If it is an error code that we did not expect, throw an regular error and hope that it gets noticed by
            // a developer
            throw new Error("Unexpected response: " + JSON.stringify(response));
        });
}

你能帮我找到吗Content-Length的回应或帮助我找到另一种方法?


服务器应该使用以下方式公开标头访问控制公开标头 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers在服务器端:

Access-Control-Expose-Headers: Content-Length

@sideshowbarkercomment https://stackoverflow.com/questions/48266678/how-to-get-the-content-length-of-the-response-from-a-request-with-fetch/48266945?noredirect=1#comment83530486_48266945解释了为什么您可以在浏览器的网络面板中看到标头,但收到null当你这样做时response.headers.get("Content-Length"):

只是因为您的浏览器收到标头并且您可以看到 devtools 中的 header 并不意味着你的前端 JavaScript 代码可以看到 它。如果跨域请求的响应没有 Access-Control-Expose-Headers:内容长度响应 — 如所示 在这个答案中——那么你的浏览器本身就会阻止你 代码能够访问标头。对于跨域请求, 您的浏览器只会向您公开特定的响应标头 前端 JavaScript 代码(如果 Access-Control-Expose-Headers 值) 包含该特定标头的名称。

您可以通过将其复制/粘贴到控制台来查看它的工作情况:

fetch("//stackoverflow.com").then(response => console.log(response.headers.get("content-length")))

请注意,返回值headers.get https://developer.mozilla.org/en-US/docs/Web/API/Headers/get将是一个字节串,因此您必须将其转换为数字才能在数字表达式中使用它:

Number(response.headers.get("content-length")) > 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 fetch() 从请求中获取响应的内容长度 的相关文章

随机推荐

  • 如何在mysql的列之间进行搜索

    我有两列存储值 数字 如何选择给定数字在两列中的值之间的位置 例子 id col1 col2 1 20 50 2 200 400 3 500 650 如果我的值为 25 我如何选择值 25 位于它们之间的记录 在本例中为第 1 行 sele
  • C 或 C++ 中 >>= 的含义是什么?

    的含义是什么 gt gt C 或 C 中的符号 它有什么特别的名字吗 我有这个for循环一些 CUDA 代码 如下所示 for int offset blockDim x offset gt 0 offset gt gt 1 Some co
  • Numpy 将布尔数组的字符串表示形式转换为布尔数组

    是否有一种原生的 numpy 方法来转换布尔值的字符串表示数组 例如 True False True False 对于我可以用于屏蔽 索引的实际布尔数组 我可以做一个 for 循环来遍历并重建数组 但对于大型数组来说 这很慢 您应该能够进行
  • 验证插件未验证所有字段

    我正在使用 jQuery 验证插件进行表单验证 它只是检查第一个字段 如果第一个字段验证为真 则正在提交表单 它不验证其余字段 我正在使用引导程序3 0
  • 输入语句块时会创建新的堆栈帧吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 语言中 大括号充当堆栈框架吗 https stackoverflow com questions 2759371 in c do braces act as a stack frame int
  • Selenium:如何点击javascript按钮

    我必须编写一些用于自动测试的脚本 以检查使用 flex amf 技术构建的 Web 应用程序的加载时间 测试将包括打开 IE 浏览器 浏览多个选项卡 并测量从单击最后一个选项卡加载页面内容到关闭浏览器的时间 我使用 Selenium Web
  • RavenDB 索引错误

    我刚刚开始使用 Raven 我创建的索引始终无法索引任何内容 我在 Raven 服务器上发现了很多如下所示的错误 Index HomeBlurb IncludeTotalCosts Error Cannot implicitly conve
  • VB.NET 尝试将通用 Invoke 方法修改为通用 BeginInvoke 方法,出现意外问题

    VB NET 2010 NET 4 Hello 我一直在使用一种非常灵活的通用调用方法来从后台线程更新 UI 我忘记了从哪里复制它 从 C 将其转换为 VB NET 但它是 Public Sub InvokeControl Of T As
  • Reflection.Emit 和泛型类型

    我在用Reflection Emit我想创建一个与 C 中定义的以下类型等效的类型 class A public Tuple
  • 如何在 Mercurial 中添加远程存储库?

    我通过以下方式使用 Git 存储库 我在不同的生产机器上有主存储库和几个遥控器 我将生产代码推送到远程并重新启动服务以使更改生效 我即将从 Git 切换到 Mercurial 我想提前知道如何实现类似的目标 您将条目添加到 paths 本地
  • 优雅地从 has_many 中选择属性:通过 Rails 中的连接模型

    我想知道从 has many 中的连接模型选择属性的最简单 最优雅的方法是什么 通过关联 假设我们有具有以下 Item 类的 Items Catalogs 和 CatalogItems class Item lt ActiveRecord
  • 抽象工厂模式是否有“更多”的现实世界示例? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在研究OPP的设计模式 只是为了给您一些背景知识 这不是我第一次遇到这些模式 我已经编程了一段时
  • 在 Rails 中动态添加字段,无需嵌套属性

    我正处于创建应用程序的早期阶段 只是放置一些基本代码 这是当前的代码 应用程序 视图 卡片 front html erb routes controller cards do get front
  • 增加 AWS Elastic Beanstalk 上 Nginx conf 中的 client_max_body_size

    我遇到了 413请求实体太大 将大于 10MB 的文件发布到在 AWS Elastic Beanstalk 上运行的 API 时出现错误 我已经做了相当多的研究 并且相信我需要提高客户端最大主体尺寸对于 Nginx 但是我似乎找不到任何有关
  • Ant属性可以解析其他属性吗?

    Ant 属性可以通过属性文件设置 从属性文件解析其他属性吗 例如 我可以这样做
  • 如何在 Chrome 中调试 HTTP POST?

    我想查看在 Chrome 中发送的 HTTP POST 数据 数据现在已在内存中 我可以重新提交表单 我知道如果我重新提交服务器会抛出错误 我可以查看 Chrome 内存中的数据吗 转到 Chrome 开发者工具 Chrome 菜单 gt
  • 如何通过函数获取ng-style的多css规则?

    我需要将多 css 规则应用于角度表单模板中的 html 标签 div class form control data objectStyle title div 控制器中的 getStyle 函数 scope getStyle funct
  • 在php中添加两个数字并保留前导零

    我需要在 php 中添加数字而不更改数字格式 如下所示 a 001 b 5 c a b 现在结果就像 6 但如果我需要 006 a是 01 那么结果应该是 06 Thanks 从技术上来说 a and b在你的例子中是strings htt
  • Go:“fmt”包缩写的含义

    什么是 fmt Golang 中的缩写是什么意思 fmt 是一个提供 I O 功能的包 例如Println 您可以使用以下命令导入它import fmt 我认为 f 表示正在格式化 但找不到正确的答案 fmt是格式的缩写 来自文档 http
  • 如何使用 fetch() 从请求中获取响应的内容长度

    我返回时遇到错误response json 当我使用空响应主体执行请求时 因此我尝试在存在空主体时仅返回一个空对象 我想要的方法是检查Content Length然而 响应的标题response headers get Content Le