V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
mogutouer
V2EX  ›  全球工单系统

华为手机不认 HTTP 303

  •  
  •   mogutouer · 2020-04-17 20:24:01 +08:00 · 2451 次点击
    这是一个创建于 1691 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们一个小程序,因为内容有些是提前生成的,所以获取用户 ID 后,就 303 转到提前在 OSS 上的一个对应的 json 文件,运行了一段时间后其中有一个客户反馈说始终载入不到内容。

    我们用该用户的 ID 测试接口一切都正常,但客户真机就是不行,然后我们把客户加到开发者然后用真机调试,发现请求没问题,也得到了了 303 的状态并且 Location 也返回了对应的地址,地址也是正常并且有内容的。

    之前用 301 因为阿里云 OSS 的文件不能用 POST 请求,否则会 405 MethodNotAllowed,所以改成了用 303,强制 GET 到那边去。

    但是华为手机获取到 303 之后就抛个 Error,然后就没然后了。

    目前用户累计一百多个手机型号,唯独华为有这个问题,请问这个锅谁背?

    手机型号:HUAWEI Mate 20 Pro ( LYA-L29 )
    系统版本:10.0.0.198
    微信版本:7.0.13
    小程序基础库版本:2.10.4
    9 条回复    2020-04-18 09:51:08 +08:00
    minami
        1
    minami  
       2020-04-17 20:29:10 +08:00   ❤️ 6
    众所周知 EMUI 已经把安卓底层掏空了,到时候抽掉框架就是 homo 系统。所以当然是开发者适配不力的锅了,华为只是“兼容安卓”而已
    mogutouer
        2
    mogutouer  
    OP
       2020-04-17 20:41:33 +08:00
    万万没想到,2020 年了,HTTP 底层的 3XX 代码还需要程序员主动判断再处理,附 2014 年 RFC 7231 标准 https://tools.ietf.org/html/rfc7231#section-6.4.2
    Seanfuck
        3
    Seanfuck  
       2020-04-17 20:41:37 +08:00 via iPhone
    又一个不买华为的理由[dog]
    kokutou
        4
    kokutou  
       2020-04-17 20:43:12 +08:00
    做个 workaround 嘛。。。

    没有专门的 workaround 突击小队嘛?
    zsj950618
        5
    zsj950618  
       2020-04-17 21:57:34 +08:00
    我感觉你这用法有点问题,

    看 303 定义

    The response to the request can be found under another URI using the GET method. When received in response to a POST (or PUT/DELETE), the client should presume that the server has received the data and should issue a new GET request to the given URI.[24]

    你是 POST 到一个 url,然后 server 返回了 303 到阿里 OSS ?总感觉不是很对。
    mogutouer
        6
    mogutouer  
    OP
       2020-04-17 22:48:22 +08:00
    @zsj950618 #5 对啊,我原本是 301,但部分手机会把 POST 请求也丢给 OSS,因为 OSS 接受不了 POST 请求,只有上传文件的时候可以 POST,所以 OSS 那边会返回 405 。

    然后查资料发现 303 是把无论什么请求最后都变成 GET 请求到目标地址,正好符合 OSS 的规则,所以就用 303 了。

    没问题的,我 POST userid 给后端,后端解析了之后让客户端去 GET 一个静态 json 文件,没毛病的,我要的也是 GET 。

    如果是 POST 转 POST 需要重新发送资料,就要用 307 或 308
    mogutouer
        7
    mogutouer  
    OP
       2020-04-17 22:51:20 +08:00
    303 的文字描述是 See Other

    本来是意思是用在比如你提交了表单了,服务器判断了,然后让你去一个结果页,那么这个结果页当然不需要再发送或接收数据,只是让你看结果,正所谓的 See Other,就是 GET 过去看。

    因为之前的 301 302 有点混乱,后来又搞了清晰的 303 307 308 这些
    zsj950618
        8
    zsj950618  
       2020-04-17 23:15:28 +08:00
    @mogutouer 好吧,用法看来是对的。

    但是众所周知,微信不用系统 webview 的,大概率还是微信的锅。
    locoz
        9
    locoz  
       2020-04-18 09:51:08 +08:00 via Android
    @zsj950618 #8 主贴中提到了“目前用户累积一百多个手机型号,唯独华为有这个问题”🤣这跟微信就没啥关系了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:17 · PVG 19:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.