V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a7217107
V2EX  ›  Java

关于前端传参问题: formData 和 json 两者有什么优劣吗?或者说存在决定性优势

  •  2
     
  •   a7217107 · 2019-10-14 10:28:30 +08:00 · 19341 次点击
    这是一个创建于 1874 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前两天根据项目后端接参问题跟同事讨论,既有 formData 又有 json,比较混乱。我的观点是 json 对于接复杂对象比较方便,formdata 需要 String 转成对象,同时参考了一些开源项目,请求封装默认的是 json 格式。同事认为,请求方式只是一种跟前端的约定,json 格式 postman 自测太麻烦,绝大多数接口 formData,遇到复杂格式的 json 接参或者 String 转对象。

    34 条回复    2019-10-15 11:05:43 +08:00
    murmur
        1
    murmur  
       2019-10-14 10:30:10 +08:00   ❤️ 1
    json 格式 postman 怎么麻烦了,直接写到 body 里,加个 type 头就完了
    a62527776a
        2
    a62527776a  
       2019-10-14 10:30:25 +08:00
    我们公司后端也是一会儿一种 烦死了
    wunonglin
        3
    wunonglin  
       2019-10-14 10:33:06 +08:00
    前端完全抛弃 formData 是可行的,只不过大多数后端框架自带了 formData 解析相对方便而已,其实是有 json 的传入参数校验之类的,class-validator 就是,只不过他们懒得。。。
    liuhuansir
        4
    liuhuansir  
       2019-10-14 10:34:14 +08:00
    感觉两者区别不大,只要统一成一种就行,两种混搭最烦
    droiz
        5
    droiz  
       2019-10-14 10:35:25 +08:00 via iPhone
    不涉及上传文件那随便,上传文件还是得 formData
    arrow8899
        6
    arrow8899  
       2019-10-14 10:40:54 +08:00
    form-data 和 json 在表示同样的信息时,form-data 数据量会小一点(a=1&b=2) 7Byte,但是 json 可读性更好({"a":1,"b":2}) 13Byte。除此之外,区别不大,只要前后端约定好就行。
    userdhf
        7
    userdhf  
       2019-10-14 10:52:37 +08:00
    post 只能用 formdata 吗?
    zivyou
        8
    zivyou  
       2019-10-14 10:55:42 +08:00
    上传文件只能用 form-data
    Vegetable
        9
    Vegetable  
       2019-10-14 10:57:14 +08:00
    主要是 form 传递二进制比较方便,不然可以完全舍弃。json 上传文件不是很合适。
    hmxxmh
        10
    hmxxmh  
       2019-10-14 10:59:34 +08:00 via Android
    @murmur 哈哈,可能他没试过
    Sapp
        11
    Sapp  
       2019-10-14 11:01:33 +08:00
    现在不是只有上传文件才用 form-data 吗?
    Kusoku
        12
    Kusoku  
       2019-10-14 11:04:29 +08:00
    postman 自测真的不麻烦啊
    Chingim
        13
    Chingim  
       2019-10-14 11:11:48 +08:00
    用 json, 便于调试 /抓包 /debug
    harde
        14
    harde  
       2019-10-14 11:19:19 +08:00
    后端偷懒了,我设计接口都是兼容 formData 与 json 的。
    barbery
        15
    barbery  
       2019-10-14 11:24:41 +08:00
    formData 只能是传递 string 格式的参数,类似 go 这类的静态语言,如果传 json 的话可以省下不少类型转换的麻烦
    maemual
        16
    maemual  
       2019-10-14 11:28:02 +08:00
    差别不大,统一成一种就行。。。
    KuroNekoFan
        17
    KuroNekoFan  
       2019-10-14 11:51:53 +08:00
    你指的 formdata,是 application/x-www-form-urlencoded 吧
    Krime
        18
    Krime  
       2019-10-14 12:02:44 +08:00
    formData 传数组和多维数据的时候比较捉急,但是更适合上传文件
    ijse
        19
    ijse  
       2019-10-14 12:05:13 +08:00
    formdata 对数组的编码方式还有很多种方式,常常会因为不统一引起麻烦,不如 json 更标准
    ipwx
        20
    ipwx  
       2019-10-14 12:07:51 +08:00 via Android
    对象一复杂,formdata 你就哭吧
    wisetc
        21
    wisetc  
       2019-10-14 12:51:42 +08:00 via iPhone
    不是两种方式都应该同时支持吗,任意调用者用着舒服就用哪种,现在大部分都支持 raw json contentType 吧。
    optional
        22
    optional  
       2019-10-14 12:55:23 +08:00 via iPhone
    前者可以传文件,后者保持结构和类型
    walpurgis
        23
    walpurgis  
       2019-10-14 13:05:01 +08:00
    Content-Type 是 json 的时候,cors 会多触发一次预检请求
    zhengjian
        24
    zhengjian  
       2019-10-14 13:11:43 +08:00
    @walpurgis 你指的是 options 方法吗,应该跟 Content-Type 没关系吧?
    lihongjie0209
        25
    lihongjie0209  
       2019-10-14 13:26:25 +08:00
    @harde #14 这个问题基本和开发无关, 取决你的用的 mvc 框架是否支持。
    jorneyr
        26
    jorneyr  
       2019-10-14 13:46:25 +08:00
    FormData 方便 XSS 过滤,但是传复杂对象 (多级属性) 麻烦
    JSON 传复杂对象方便,但是 XSS 过滤麻烦
    harde
        27
    harde  
       2019-10-14 13:50:57 +08:00
    @lihongjie0209 框架不支持就不能自己写了?写个过滤器一劳永逸。
    lihongjie0209
        28
    lihongjie0209  
       2019-10-14 14:15:31 +08:00
    @harde #27 那么你还需要定义一套 formdata 字段解析的规则 ?

    类似于 reqObject[listField][index_1][objectfield] = 1 ?? 这样的?
    DOLLOR
        29
    DOLLOR  
       2019-10-14 15:37:20 +08:00 via Android
    FormData 传简单的 key-value 挺方便的,但是嵌套对象、数组就比较麻烦了。所以要根据你的情况考虑选择。
    mmrx
        30
    mmrx  
       2019-10-14 15:41:41 +08:00   ❤️ 1
    有必要统一么,我前后端客户端都写,参数简单就用 FromData,复杂参数就用 Json 格式传参
    根据实际情况选用就好了,或者有偏好+自己可以决定用什么格式的话,想用什么格式用什么格式
    否则,还是看清接口文档,参数格式到底是啥,反正也没有决定权...
    jzmws
        31
    jzmws  
       2019-10-14 16:21:53 +08:00
    @harde 这么写的 ? 有例子不 ?
    ma836323493
        32
    ma836323493  
       2019-10-14 17:30:42 +08:00 via Android   ❤️ 2
    传什么都好,别再给我传 undefined 了,脑壳疼
    Takamine
        33
    Takamine  
       2019-10-15 00:05:05 +08:00 via Android
    还是除了文件上传之外统一 json 吧。
    SkyLine7
        34
    SkyLine7  
       2019-10-15 11:05:43 +08:00
    文件上传,formData,其他一律 json 或者 urlencoding
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:15 · PVG 03:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.