因为fetch中的response属性我卡了半天

691 阅读4分钟

很不幸,当你手中有一个屎山项目时,你只能屎上堆屎......

同一个接口,多传一个请求头参数前端就会报错,而为了完成需求,这个参数又必须传。 返回值如下:

image.png 不管是否传值,返回的值都是一样的,catch一下错误:

image.png

json格式化失败,接口是用fetch请求的,既然返回值都一样,为什么一个成功一个失败呢? 于是我在屎山里扒啊扒...... 终于,在一个不起眼的角落里,初见端倪

image.png

没错,两次请求的response里的header不一样,这个header里究竟有什么?打印一下

image.png

直接打是个空对象,嗯? 不可能什么都没有吧,那怎么一次能读到里面的contentType,一次不能呢? 百度一下,使用迭代的方法打印

image.png 终于看到庐山真面目了

image.png 两次请求接口的区别就在于,一次请求返回的请求头有contentType,一次没有!后端同学怎么回事?

8c151b6133cec02390949b164f45704.png 不行,让他塞一下! fetch中的response究竟是个啥呢?KIMI一下

在使用 fetch API 进行网络请求时,response 是一个非常重要的对象,它包含了服务器返回的所有信息。

response中的常见属性

  1. status

    • 类型number
    • 描述:HTTP 状态码,例如 200 表示成功,404 表示未找到,500 表示服务器错误等。
    • 示例response.status 返回 200
  2. statusText

    • 类型string
    • 描述:HTTP 状态码的文本描述,例如 "OK"、"Not Found"、"Internal Server Error" 等。
    • 示例response.statusText 返回 "OK"
  3. ok

    • 类型boolean
    • 描述:如果状态码在 200-299 之间,返回 true,否则返回 false
    • 示例response.ok 返回 true 或 false
  4. type

    • 类型string
    • 描述:响应的类型,可能的值有 "basic""cors""default""error""opaque" 等。
    • 示例response.type 返回 "basic"
  5. url

    • 类型string
    • 描述:响应的 URL。
    • 示例response.url 返回 "https://api.example.com/data"
  6. headers

    • 类型Headers
    • 描述:一个 Headers 对象,包含响应的 HTTP 头信息。
    • 示例response.headers.get('Content-Type') 返回 "application/json"
  7. body

    • 类型ReadableStream
    • 描述:响应的主体内容,是一个可读流。
    • 示例response.body 返回一个 ReadableStream 对象

response中的常见方法

  1. arrayBuffer()

    • 返回值Promise<ArrayBuffer>

    • 描述:将响应体转换为 ArrayBuffer

    • 示例

      javascript
      response.arrayBuffer().then(arrayBuffer => {
        console.log(arrayBuffer);
      });
      
  2. blob()

    • 返回值Promise<Blob>

    • 描述:将响应体转换为 Blob

    • 示例

      javascript
      response.blob().then(blob => {
        console.log(blob);
      });
      
  3. json()

    • 返回值Promise<any>

    • 描述:将响应体转换为 JSON 对象。

    • 示例

      javascript
      response.json().then(data => {
        console.log(data);
      });
      
  4. text()

    • 返回值Promise<string>

    • 描述:将响应体转换为文本。

    • 示例

      javascript
      response.text().then(text => {
        console.log(text);
      });
      
  5. formData()

    • 返回值Promise<FormData>

    • 描述:将响应体转换为 FormData

    • 示例

      javascript复制
      response.formData().then(formData => {
        console.log(formData);
      });
      

那为什么fetch中的header为什么不能直接打印?

fetch API 中,Response 对象的 headers 属性是一个 Headers 对象,它是一个特殊的类,用于表示 HTTP 头信息。Headers 对象不能直接打印,因为它不是一个普通的对象,而是一个具有特定方法和行为的类。这主要是出于安全和性能考虑。

  1. 安全考虑

    • HTTP 头信息可能包含敏感信息,如认证令牌、用户代理等。直接暴露这些信息可能会导致安全问题。
    • 浏览器对某些头信息进行了保护,不允许脚本直接访问,例如 Set-Cookie 和 Authorization 等。
  2. 性能考虑

    • Headers 对象是一个高效的实现,它内部使用了特定的数据结构来存储头信息。直接打印可能会导致性能问题,尤其是在头信息非常多的情况下。

那我就是想打呢?如何打印 Headers 对象?也不是没有办法

虽然不能直接打印 Headers 对象,但可以使用 Headers 对象提供的方法来获取和打印特定的头信息。以下是一些常用的方法:

  1. get(name)

    • 参数name(字符串)—— 要获取的头信息的名称。

    • 返回值:头信息的值,如果不存在则返回 null

    • 示例

      javascript
      const contentType = response.headers.get('Content-Type');
      console.log('Content-Type:', contentType);
      
  2. has(name)

    • 参数name(字符串)—— 要检查的头信息的名称。

    • 返回值:布尔值,表示是否存在该头信息。

    • 示例

      javascript
      const hasContentType = response.headers.has('Content-Type');
      console.log('是否存在 Content-Type:', hasContentType);
      
  3. keys()

    • 返回值:一个迭代器,包含所有头信息的名称。

    • 示例

      javascript
      for (const key of response.headers.keys()) {
        console.log('头信息名称:', key);
      }
      
  4. values()

    • 返回值:一个迭代器,包含所有头信息的值。

    • 示例

      javascript
      for (const value of response.headers.values()) {
        console.log('头信息值:', value);
      }
      
  5. entries()

    • 返回值:一个迭代器,包含所有头信息的名称和值的键值对。

    • 示例

      javascript
      for (const [key, value] of response.headers.entries()) {
        console.log('头信息名称:', key, '值:', value);
      }
      

看来要再仔细学习一下fetch了,一个小小的response中都有这么多学问! 好了,小葵花妈妈课堂下课了,我们下期再见!