V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abelyao
V2EX  ›  问与答

关于 Payload 和 FormData 以及服务端接收的问题,大家是怎么选的呢?

  •  
  •   abelyao · 2016-04-15 11:42:51 +08:00 via iPhone · 5031 次点击
    这是一个创建于 3149 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们都知道如果在前端直接提交表单的话,数据包是以 FormData 类型提交到服务端的,在服务端(例如 PHP )则直接 $_POST['xxx'] 可以获取到。

    但如果在前端使用 AJAX 提交,例如 AngularJS 的 $http.post(),则是用 Payload 格式发送的,在服务端用 $_POST['xxx'] 是拿不到数据的,需要读取 php://input 才可以拿到数据包。

    那么问题来了,如果开发一个 API ,不限于只给 HTML 前端调用,可能还会有 iOS 等各种客户端,甚至是直接 curl 命令,那么服务端(不限于 PHP )应该读哪个数据呢?是直接拿 post 还是拿 input 后自己处理呢?

    我知道 AngularJS 可以把数据转成 FormData 后再提交,但如果面向各种前端、客户端,后端应该使用哪种更规范一些?

    想听听大家实际开发的经验
    15 条回复    2016-04-15 16:25:48 +08:00
    vm
        1
    vm  
       2016-04-15 11:51:31 +08:00 via Android
    如果你要支持表单提交,那就搞 post 和 formdata 那种。否则请求都是可以自定义的,你 post json 也都可以。
    pangliang
        2
    pangliang  
       2016-04-15 12:07:22 +08:00
    统一按照 FormData 的取, Payload 的套一层转换呗
    abelyao
        3
    abelyao  
    OP
       2016-04-15 12:52:14 +08:00 via iPhone
    @vm 不需要支持原生表单了,就算前端页面也都走 AJAX 了
    vm
        4
    vm  
       2016-04-15 13:15:35 +08:00 via Android
    @abelyao 嗯。我其实是觉得这些格式都是小问题,随便选一个用的比较多的应该都没问题。确实想要搞得高大上的话可以用个 rpc 框架,比如 google 的 protobuf 。
    abelyao
        5
    abelyao  
    OP
       2016-04-15 13:19:28 +08:00 via iPhone
    @vm 不不不,当然不是为了高大上,是考虑各种前端后端的兼容性问题,毕竟 API 定下来了,以后再修改也会影响已有的前端
    vm
        6
    vm  
       2016-04-15 13:41:37 +08:00 via Android
    @abelyao 不会有啥兼容性问题啊。。前端的话,浏览器里有 xhr ,浏览器外本来就没什么限制。后端就更没问题了。用的都是 http 的标准功能啊。。。
    如果你觉得以后会改 api ,可以加个 api 版本号。好多 api 都是这么做的
    abelyao
        7
    abelyao  
    OP
       2016-04-15 14:21:57 +08:00 via iPhone
    @vm 也是,或者可以加个 query 参数来表示以什么格式传入数据
    cxbig
        8
    cxbig  
       2016-04-15 14:31:43 +08:00
    建议统一使用 json 格式做 API
    BOYPT
        9
    BOYPT  
       2016-04-15 14:33:46 +08:00
    不该是根据 content-type 来判断么……
    abelyao
        10
    abelyao  
    OP
       2016-04-15 14:37:15 +08:00 via iPhone
    @BOYPT 包括输入吗?那就是用 Payload 咯?
    pangliang
        11
    pangliang  
       2016-04-15 14:44:35 +08:00
    不管你最开始什么格式, 你最后处理器肯定是用 map 的格式取参数: $xxx['xx'] , 所以做一个转换层, 把输入的格式 json 或者 input 的, 转成 map; 再路由处理就是了
    /raw/user/login 路由器就先 $param = rawToArray(); 再 dispatch('/user/login',$param);
    /json/user/login 路由器就先 $param = jsonToArray(); 一样 dispatch('/user/login',$param);

    处理器 UserAction.php 就是用$param['username']
    learnshare
        12
    learnshare  
       2016-04-15 14:48:03 +08:00
    FormData 只在需要上传文件的时候会用,其他都是 JSON
    BOYPT
        13
    BOYPT  
       2016-04-15 14:52:54 +08:00
    @abelyao content-type 是 headers 里面的……根据 content-type 判断来源是什么类型,再去调用解析器。一般来说框架都会有处理好这样的逻辑,我建议不要自己重复实现。
    比如 Slim3 框架里面默认的几个解释器可以处理 json/xml/formdata 格式的代码:

    https://github.com/slimphp/Slim/blob/3.x/Slim/Http/Request.php#L196
    tidezyc
        14
    tidezyc  
       2016-04-15 14:54:40 +08:00 via iPhone
    http 协议早就帮你想好了,不如你以为 content-type 是用来干嘛的
    abelyao
        15
    abelyao  
    OP
       2016-04-15 16:25:48 +08:00 via iPhone
    @BOYPT 呃这个是知道的,刚刚我是 @ 错人了,我是想
    @cxbig 问他:包括输入吗?那就是用 Payload 咯?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:32 · PVG 06:32 · LAX 14:32 · JFK 17:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.