V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yazoox
V2EX  ›  JavaScript

URL 的参数,长度最大的限制是多少?

  •  
  •   yazoox · 2022-06-07 10:56:32 +08:00 · 3351 次点击
    这是一个创建于 924 天前的主题,其中的信息可能已经有所发展或是发生改变。

    维护的老产品,现在在用 CEF 调用 webview 来展示新开发的界面。所以,参数都是通过 url params 传递进来的。例如,http://localhost:8080/index.html?name=1111&type=V2&data=xxx

    这里的 data ,我想传一个 serailized 的 json 格式的数据,但是这样的话,我担心,如果数据太大,会不会超过 url 的参数长度限制? google 了一下,发现各种说法都有,有的说是 2000 多,有的说没有限制...

    p.s.
    json 格式的数据结构大概如下。目前根据已知的数据,一次性传递这个数据,大概最多可能有小几百条。或者有没有比较好用的 serialize/deserialize ,同时能够压缩数据的方法?

    interface TFile {
      name: string;
      size: string;
      path: string;
    }
    
    16 条回复    2022-06-08 10:33:25 +08:00
    Torpedo
        1
    Torpedo  
       2022-06-07 11:01:26 +08:00
    一般看服务端的配置。我记得 ng 默认是 2kb 还是多少
    lisongeee
        2
    lisongeee  
       2022-06-07 11:05:49 +08:00
    可以只传一个 object_id ,然后使用 js_bridge 向 native 获取数据
    liangch
        3
    liangch  
       2022-06-07 11:06:54 +08:00
    有这个时间,试一下不就知道了。
    Nich0la5
        4
    Nich0la5  
       2022-06-07 11:09:15 +08:00
    这个没有一个固定的规范,ie 是只有 2000 多,chrome 和 firefox 很长 好像是 65535 ,但是中间的 nginx 啥的也可能给你截断,
    所以正经人谁用 url 传 json 啊
    lisongeee
        5
    lisongeee  
       2022-06-07 11:10:19 +08:00   ❤️ 1
    query 参数会发送服务器,hash 参数不会,如果数据是单纯传递给页面而不是服务器,那还是用 hash 比较好,最大长度和浏览器有关系,你可以自己手动构造 url 然后用 window.open 测试,json 可以定义字段映射后压缩属性名,不过要传递大量数据建议还是使用 js_bridge
    lolizeppelin
        6
    lolizeppelin  
       2022-06-07 11:40:46 +08:00
    自己写过看过 http 服务源码就知道了

    服务端 http 读取头部有个默认的 max head length 长度, 这个值设定第一次 socket read 的最大长度
    如果发送的 http 头长度头超过这个值,那么服务端读取的时候会发现 http 头没完结,http 协议无法解析,直接终止

    每个服务端的的 max head length 都是可设置的,默认值不一定一样

    参数是 url 的一部分, url 和 headers 数据都在 http 头里,所以 http 长度的限制不是定值
    Jooooooooo
        7
    Jooooooooo  
       2022-06-07 11:43:58 +08:00
    别在 url 放那么大的东西

    你需要的是把这些放到 post 请求的 body 里面去
    lolizeppelin
        8
    lolizeppelin  
       2022-06-07 11:46:03 +08:00
    http 服务端的 max head length 是一种简化处理方式
    因为 http 包的长度在 http 头里,在读取完 http 头前没法判断总长度
    为了避免无限制的读取 http 头,直接设置 max head 长度
    yazoox
        9
    yazoox  
    OP
       2022-06-07 11:53:16 +08:00
    @lisongeee
    "query 参数会发送服务器,hash 参数不会,如果数据是单纯传递给页面而不是服务器,那还是用 hash 比较好"
    这段不是很明白,能多说一点么?谢谢
    IvanLi127
        10
    IvanLi127  
       2022-06-07 12:09:53 +08:00 via Android
    这种看实现的限制,楼主你只能手动测了。。。
    huangmingyou
        11
    huangmingyou  
       2022-06-07 12:29:28 +08:00
    翻 rfc
    aaronlam
        12
    aaronlam  
       2022-06-07 13:14:33 +08:00
    @yazoox 你可以发现在浏览器里输入某个网页 URL ,并且 URL 形如 https://www.example.com/test#12345 的话,最终请求服务器只会以这样去进行请求 https://www.example.com/test ,而 # 符号后面的东东,只有浏览器能拿到。
    yazoox
        13
    yazoox  
    OP
       2022-06-07 15:21:24 +08:00
    @aaronlam 哦~ 这个有点意思,以前不知道。我研究一下
    thx
    xyjincan
        14
    xyjincan  
       2022-06-08 08:50:48 +08:00 via Android
    看谷歌翻译的参数,最大 5000 字符
    microxiaoxiao
        15
    microxiaoxiao  
       2022-06-08 09:37:45 +08:00 via Android
    http 标准不做限制,浏览器和服务器本身做限制,主流的软件范围为 2k-64k 之间,浏览器像 chrome 等应该是 2k ,服务器 nginx 是 4k ,所以你的参数小于 2k-其他的字段就行。不然就别搞,兼容性不好
    DOLLOR
        16
    DOLLOR  
       2022-06-08 10:33:25 +08:00
    可以考虑把?改成#,这样#后面的字符串不会被提交到服务器上,也就不用担心长度限制。
    前端页面加载完后,可以拿到#后面的字符串用 JS 解析,再由 JS 用 POST 方式提交到服务器上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:42 · PVG 09:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.