有大佬来说下 axios 与$_POST 的恩恩怨怨么?

2018-08-22 09:48:55 +08:00
 Junjunya
axios 默认发出的 post 请求, $_POST 无法接收。

稍微浅一点的原因我已经了解了,但是更加深入的

比如历史原因,或者 PHP $_POST 的实现,以及 http 协议上的细节还不是很清楚

有大佬来做下科普么
4226 次点击
所在节点    PHP
23 条回复
nosay
2018-08-22 09:55:49 +08:00
formdata 了解一下
weirdo
2018-08-22 10:05:33 +08:00
php://input
lianyue
2018-08-22 10:06:37 +08:00
context-type 参数呢
zjsxwc
2018-08-22 10:11:36 +08:00
Junjunya
2018-08-22 10:16:49 +08:00
楼上说的 都已经知道了, 解决方案也知道,还有没有更加干货一点的东西??
想知道这种情况出现的更深一层的原因,以及未来 PHP 的$_POST 是不是应该默认可以解析这种请求
eslizn
2018-08-22 10:19:31 +08:00
php 的$_POST 只解析 application/x-www-form-urlencoded,其他的情况需要你自己处理

@lianyue content-type
eslizn
2018-08-22 10:20:26 +08:00
@Junjunya 要么你用成熟点的框架,一般内置的 request 对象都会处理这个问题
jswh
2018-08-22 10:25:31 +08:00
$_POST 里面解析的是 post body 里面 xx=yyy&aaa=bbb 这种格式。axios 发送的是 json,无法解析就无法解析到任何内容。PHP 不会取分辨 header 里面的 content-type, 并更具 content-type 来解析 post body,这个自己封装一下就好了,很多框架里也有这个功能。直接使用$_POST 对于认真写项目来说,本来就不是很好的做法。
johnj
2018-08-22 10:27:05 +08:00
主要你对 POST 请求,参数的几种编码方式没有概念。
起码有这几种(不是学名):
form-urlencoded: 参数编码跟 url 上的格式一样 foo=bar&boo2=bar2 数组之类的怎么表达可以查查
multipart: 这种跟传文件的时候用的编码一样,比较复杂,搜一下
json: 请求体内就是个 json

不同的编码 还要不同的 Content-Type 头来配合。

发请求、接收请求的双方,必须对请求的编码方式达成一致,才能正确接收。
sarices
2018-08-22 10:41:51 +08:00
php://input 了解一下
lrz0lrz
2018-08-22 11:06:59 +08:00
otakustay
2018-08-22 11:29:00 +08:00
逻辑很简单嘛,就是 2 个时代的产物相互对接不上,再正常不过了,而且一般来说也应该 php 端去适配 axios
tinytin
2018-08-22 12:45:21 +08:00
9 楼说得对
tomczhen
2018-08-22 12:58:46 +08:00
简单啊,只要用新技术的统统枪毙打死,这样就能保证兼容了。
KuroNekoFan
2018-08-22 13:41:39 +08:00
首先 axios 不是 nodejs 这个 runtime 而是 browser 的,另外也跟`httpclient`没什么关系,然后,我觉得这不能说是无法接收,而是接收了却不知道该如何解析
msg7086
2018-08-22 14:22:23 +08:00
比较现代化的 PHP 4.0 发布于 2001 年。
JSON 标准 RFC 是 2006 年的。
Axios 不知道是哪年的,但是应该不会很早。

所以你说为什么 PHP 不支持 JSON 解析呢?因为那时候还没有 JSON 这玩意儿。而 JSON 诞生之后,再改 PHP 就会有潜在的向前兼容问题,不能乱动了。所以也算是历史原因吧。
scofieldpeng
2018-08-22 14:23:10 +08:00
你想让$_POST 接收,可以啊,你自己封装出一个来,如果是 content_type=application/json 的时候自己从 php://input 读出值,然后解析后设置到$_POST,不过如果 body 体是一个 array 你就不好玩了,其实这东西有啥纠结的,那我告诉你,get 请求中 body 还给你带参数你是不是更诧异了?
Junjunya
2018-08-22 14:25:52 +08:00
@KuroNekoFan 老哥呦
axios 在 git 的 README.md 里面的介绍就是

Promise based HTTP client for the browser and node.js

git 地址 https://github.com/axios/axios#axios

人家的定位就是 httpclient,并且 browser 或者 node 环境都可以用


@lrz0lrz 谢谢指导


@otakustay 一般的后端来适配么? 兼容不应该是兼容已经存在的标准么
比如下面这种场景,一个项目 里面有部分接口还是旧的,旧的接口 肯定是能不去修改 就不去修改的。就需要前端来做适配了
yixiang
2018-08-22 14:29:21 +08:00
#9 说的无误。

这问题跟 node, php, axios 都无关,是 http 协议的事。随手找几个链接:

https://www.jianshu.com/p/fbd1ba0a7ce7
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type
otakustay
2018-08-22 14:31:21 +08:00
@Junjunya 因为发 JSON 就是当代的普遍实践,在历史与当前不冲突的时候由当前兼容历史,冲突的时候就直接淘汰历史,车轮总是要前进的

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

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

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

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

© 2021 V2EX