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 · 62 天前 · 2168 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

    维护的老产品,现在在用 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  
       62 天前
    一般看服务端的配置。我记得 ng 默认是 2kb 还是多少
    lisongeee
        2
    lisongeee  
       62 天前
    可以只传一个 object_id ,然后使用 js_bridge 向 native 获取数据
    liangch
        3
    liangch  
       62 天前
    有这个时间,试一下不就知道了。
    Nich0la5
        4
    Nich0la5  
       62 天前
    这个没有一个固定的规范,ie 是只有 2000 多,chrome 和 firefox 很长 好像是 65535 ,但是中间的 nginx 啥的也可能给你截断,
    所以正经人谁用 url 传 json 啊
    lisongeee
        5
    lisongeee  
       62 天前   ❤️ 1
    query 参数会发送服务器,hash 参数不会,如果数据是单纯传递给页面而不是服务器,那还是用 hash 比较好,最大长度和浏览器有关系,你可以自己手动构造 url 然后用 window.open 测试,json 可以定义字段映射后压缩属性名,不过要传递大量数据建议还是使用 js_bridge
    lolizeppelin
        6
    lolizeppelin  
       62 天前
    自己写过看过 http 服务源码就知道了

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

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

    参数是 url 的一部分, url 和 headers 数据都在 http 头里,所以 http 长度的限制不是定值
    Jooooooooo
        7
    Jooooooooo  
       62 天前
    别在 url 放那么大的东西

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