zoukankan      html  css  js  c++  java
  • Http2改造实践:statusText丢失问题

    背景:

    1、项目中的nginx由http1.1改造为http2,

    2、代码中采用axios的interceptors做统一返回处理,对于系统逻辑性错误弹窗(例如:表单字段唯一性校验弹窗提示)

    现象:

    1、在Chrome中打开,Http2中所有的弹窗失效

    2、Http1.1中正常

    猜测是拦截部分的代码没有执行,

    axiosInstance.interceptors.response.use((response) => {
      if (response.status === 200 && response.statusText === 'OK') {
        const appData = response.data;
    
        if (appData && appData .resultCode) {
    
        ...  // 后续处理逻辑省略

    期中这里的判断 status应该不会变,appData是后台返回的json数据应该也不会变,猜测是statusText有问题。

    打开Chrome浏览器console,果然在Http2下response.statusText是""

    百度,Google一下...。 嘿嘿

    stack overflow上有类似问题

    https://stackoverflow.com/questions/42401795/with-http-2-only-xmlhttprequest-responses-statustext-property-seems-to-be-us

    大意是 statusText 会随着浏览器的变化而变化

    Http2:Chrome (56.0.2924.87):

    {
      status: 200,
      statusText: "", // empty
      config: {...},
      data: {...}
    }

    Http2:Firefox (51.0.1):

    {
      status: 200,
      statusText: "OK", // as http1.1 (+1)
      config: {...},
      data: {...}
    }

    Http2:Safari (10.0.3):

    {
      status: 200,
      statusText: "HTTP/2.0 200", // ?!
      config: {...},
      data: {...}
    }

    下面是Chrome浏览器依赖的chromium团队关于这个问题的讨论:

    https://bugs.chromium.org/p/chromium/issues/detail?id=475223

    大概意思就是http2默认返回头没有statusText,在http1.1中statusText也不是必须的
    他们最后讨论不加statusText,不要像firefox一样给默认加上statusText,以免造成误解

    结论:Http2中不要用statusText,除非你在服务器给加上这个返回头

  • 相关阅读:
    进制
    enum
    文件操作fstream
    文件读取 FILE
    static_cast、dynamic_cast、reinterpret_cast、和const_c
    std::max 错误
    boost 时间
    c++ new 和delete
    c++ static静态
    BOOST 之filesystem, path
  • 原文地址:https://www.cnblogs.com/smileSmith/p/7449496.html
Copyright © 2011-2022 走看看