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

2016-04-15 11:42:51 +08:00
 abelyao
我们都知道如果在前端直接提交表单的话,数据包是以 FormData 类型提交到服务端的,在服务端(例如 PHP )则直接 $_POST['xxx'] 可以获取到。

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

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

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

想听听大家实际开发的经验
5030 次点击
所在节点    问与答
15 条回复
vm
2016-04-15 11:51:31 +08:00
如果你要支持表单提交,那就搞 post 和 formdata 那种。否则请求都是可以自定义的,你 post json 也都可以。
pangliang
2016-04-15 12:07:22 +08:00
统一按照 FormData 的取, Payload 的套一层转换呗
abelyao
2016-04-15 12:52:14 +08:00
@vm 不需要支持原生表单了,就算前端页面也都走 AJAX 了
vm
2016-04-15 13:15:35 +08:00
@abelyao 嗯。我其实是觉得这些格式都是小问题,随便选一个用的比较多的应该都没问题。确实想要搞得高大上的话可以用个 rpc 框架,比如 google 的 protobuf 。
abelyao
2016-04-15 13:19:28 +08:00
@vm 不不不,当然不是为了高大上,是考虑各种前端后端的兼容性问题,毕竟 API 定下来了,以后再修改也会影响已有的前端
vm
2016-04-15 13:41:37 +08:00
@abelyao 不会有啥兼容性问题啊。。前端的话,浏览器里有 xhr ,浏览器外本来就没什么限制。后端就更没问题了。用的都是 http 的标准功能啊。。。
如果你觉得以后会改 api ,可以加个 api 版本号。好多 api 都是这么做的
abelyao
2016-04-15 14:21:57 +08:00
@vm 也是,或者可以加个 query 参数来表示以什么格式传入数据
cxbig
2016-04-15 14:31:43 +08:00
建议统一使用 json 格式做 API
BOYPT
2016-04-15 14:33:46 +08:00
不该是根据 content-type 来判断么……
abelyao
2016-04-15 14:37:15 +08:00
@BOYPT 包括输入吗?那就是用 Payload 咯?
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
2016-04-15 14:48:03 +08:00
FormData 只在需要上传文件的时候会用,其他都是 JSON
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
2016-04-15 14:54:40 +08:00
http 协议早就帮你想好了,不如你以为 content-type 是用来干嘛的
abelyao
2016-04-15 16:25:48 +08:00
@BOYPT 呃这个是知道的,刚刚我是 @ 错人了,我是想
@cxbig 问他:包括输入吗?那就是用 Payload 咯?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/271269

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX