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

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

  •  
  •   Junjunya · 2018-08-22 09:48:55 +08:00 · 4226 次点击
    这是一个创建于 2285 天前的主题,其中的信息可能已经有所发展或是发生改变。
    axios 默认发出的 post 请求, $_POST 无法接收。

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

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

    有大佬来做下科普么
    第 1 条附言  ·  2018-08-22 10:39:30 +08:00
    感谢各位大佬的回复, 应该把这问题丢到 前端圈子里来问。

    其实我想问的问题是 为啥 axios 要这么处理?

    自己思考了下,不知道对不对
    axios 是 node 的一个 httpclient 组件,所以默认的请求头
    Content-Type 不是 application/x-www-form-urlencoded 可以理解。

    但是从前端需求上来说 ,为啥不加个配置选项 可以和 $.ajax $.post 似的兼容呢。

    不仅仅 PHP 的$_POST 没法接收,Java 在某些情况也不好接收,并且如果是以前的项目的话,改动接收方式也必将麻烦

    当然前端可以通过 qs 或者其他方式来解决这个问题。
    23 条回复    2018-09-03 13:56:56 +08:00
    nosay
        1
    nosay  
       2018-08-22 09:55:49 +08:00
    formdata 了解一下
    weirdo
        2
    weirdo  
       2018-08-22 10:05:33 +08:00
    php://input
    lianyue
        3
    lianyue  
       2018-08-22 10:06:37 +08:00 via iPhone
    context-type 参数呢
    Junjunya
        5
    Junjunya  
    OP
       2018-08-22 10:16:49 +08:00
    楼上说的 都已经知道了, 解决方案也知道,还有没有更加干货一点的东西??
    想知道这种情况出现的更深一层的原因,以及未来 PHP 的$_POST 是不是应该默认可以解析这种请求
    eslizn
        6
    eslizn  
       2018-08-22 10:19:31 +08:00
    php 的$_POST 只解析 application/x-www-form-urlencoded,其他的情况需要你自己处理

    @lianyue content-type
    eslizn
        7
    eslizn  
       2018-08-22 10:20:26 +08:00
    @Junjunya 要么你用成熟点的框架,一般内置的 request 对象都会处理这个问题
    jswh
        8
    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
        9
    johnj  
       2018-08-22 10:27:05 +08:00   ❤️ 2
    主要你对 POST 请求,参数的几种编码方式没有概念。
    起码有这几种(不是学名):
    form-urlencoded: 参数编码跟 url 上的格式一样 foo=bar&boo2=bar2 数组之类的怎么表达可以查查
    multipart: 这种跟传文件的时候用的编码一样,比较复杂,搜一下
    json: 请求体内就是个 json

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

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

    所以你说为什么 PHP 不支持 JSON 解析呢?因为那时候还没有 JSON 这玩意儿。而 JSON 诞生之后,再改 PHP 就会有潜在的向前兼容问题,不能乱动了。所以也算是历史原因吧。
    scofieldpeng
        17
    scofieldpeng  
       2018-08-22 14:23:10 +08:00
    你想让$_POST 接收,可以啊,你自己封装出一个来,如果是 content_type=application/json 的时候自己从 php://input 读出值,然后解析后设置到$_POST,不过如果 body 体是一个 array 你就不好玩了,其实这东西有啥纠结的,那我告诉你,get 请求中 body 还给你带参数你是不是更诧异了?
    Junjunya
        18
    Junjunya  
    OP
       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
        19
    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
        20
    otakustay  
       2018-08-22 14:31:21 +08:00
    @Junjunya 因为发 JSON 就是当代的普遍实践,在历史与当前不冲突的时候由当前兼容历史,冲突的时候就直接淘汰历史,车轮总是要前进的
    otakustay
        21
    otakustay  
       2018-08-22 14:31:38 +08:00
    @Junjunya 因为发 JSON 就是当代的普遍实践,在历史与当前不冲突的时候由当前兼容历史,冲突的时候就直接淘汰历史,车轮总是要前进的
    enjoyCoding
        22
    enjoyCoding  
       2018-08-23 02:40:00 +08:00 via Android
    ??? 项目中用到 axios,后端 php CI 框架 底层就是用$_POST 接收的 没遇到过你的这个问题啊… 确定是接收不到吗?
    wo642436249
        23
    wo642436249  
       2018-09-03 13:56:56 +08:00
    遇到过跨域的问题,没遇到过楼主说的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2675 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:20 · PVG 13:20 · LAX 21:20 · JFK 00:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.