Laravel 的 post 问题,哪位先知给指点下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunorg
V2EX    PHP

Laravel 的 post 问题,哪位先知给指点下

  •  
  •   sunorg 2020-12-08 15:49:15 +08:00 3131 次点击
    这是一个创建于 1768 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新用 Laravel 框架,当前版本 7.x, 现遇到一个问题:

    写一 api 代码,已引入 request 依赖,get 请求可以得到数据,post 方式的文件上传也可以,但单纯 post 表单请求无法得到数据*。 具体代码如下

    接口文件

     public function createUser(Request $request) { var_dup($_POST); //有值, if($request->has(['email'])){ return json_encode(['有数据'=>1]); } else{ return json_encode(['没数据'=>0]); //始终是没数据。 } } 

    路由文件 api.php:

     Route::post('xxx/create-user', 'AdminController@createUser'); 

    测试过程: 用 paw,选择 post 模式,设置变量 email=xxxx,测试 request->all(),无法找到该数据。

    rS70Tf.md.png

    25 条回复    2020-12-10 10:19:25 +08:00
    sunorg
        1
    sunorg  
    OP
       2020-12-08 15:57:31 +08:00
    附加另外一款 api 调试工具的结果,一样的。。。

    ![image.png]( https://01.urlnode.com/2020/12/08/image.png)
    mamahaha
        2
    mamahaha  
       2020-12-08 15:58:53 +08:00
    哈哈哈,先知。。。。。。这是阿拉伯的程序员吗?
    sunorg
        3
    sunorg  
    OP
       2020-12-08 16:02:27 +08:00
    @mamahaha 尽可能的字面意思理解,哈哈。
    xlcoder166
        4
    xlcoder166  
       2020-12-08 16:10:38 +08:00
    If you would like to determine if a value is present on the request and is not empty, you may use the filled method:

    https://laravel.com/docs/8.x/requests#determining-if-an-input-value-is-present

    1. has 只是判断存在 “eamil” 而不是值
    2. 更好的判断方式 应该是 validate
    Xusually
        5
    Xusually  
       2020-12-08 16:43:35 +08:00
    看下面。。这就尴尬了。。
    sunorg
        6
    sunorg  
    OP
       2020-12-08 18:44:12 +08:00 via Android
    @xlcoder166 除了 has,我试过 all 函数,还试过单独获取,一样的结果。

    @Xusually 调试几轮后,只要能有所响应就行,合理不,丑不,不是这里讨论。我只在乎他能有个响,但它没… /狗头
    sunorg
        7
    sunorg  
    OP
       2020-12-08 18:47:41 +08:00 via Android
    @Xusually, 我一定疯魔了,眼花你的有值。 看来我得拿一个全新的项目来跟踪了…
    vovov
        8
    vovov  
       2020-12-08 19:24:39 +08:00 via Android
    看是不是 crsf 的问题
    Xusually
        9
    Xusually  
       2020-12-08 21:56:57 +08:00
    @vacker csrf 的话,一般会报 419
    Xusually
        10
    Xusually  
       2020-12-08 21:58:08 +08:00
    @sunorg 我就是看你这个不太合情理,临时 laravel new 了一个新项目,就关了 csrf,复制了你的代码,啥也没改。
    不关 csrf 的话用 paw 这些工具简易测试容易 419,请求进不去。
    ooh
        11
    ooh  
       2020-12-08 22:19:12 +08:00
    看上去代码没啥问题,$_POST 打印出来是啥 看看是不是 email 这五个字符不一样
    chengfeng
        12
    chengfeng  
       2020-12-08 22:38:12 +08:00
    注意下你的中间件,可以先把中间件去掉试试
    yekern
        13
    yekern  
       2020-12-09 07:37:08 +08:00
    然鹅我这边并没有你这问题 可能是我这边版本过高?
    [![r9Qk80.png]( https://s3.ax1x.com/2020/12/09/r9Qk80.png)]( https://imgchr.com/i/r9Qk80)
    sunorg
        14
    sunorg  
    OP
       2020-12-09 08:45:54 +08:00
    @Xusually @chengfeng @yekern

    我再跟下,看看是否是 sanctum 和中间件的问题
    zachlhb
        15
    zachlhb  
       2020-12-09 08:46:52 +08:00 via Android
    改请求头数据类型改成 urlencode 那个
    weirdo
        16
    weirdo  
       2020-12-09 09:17:09 +08:00
    目测 multipart/form-data 和 application/x-www-form-urlencoded 引起的
    如果只是写接口,建议统统用 json
    skys215
        17
    skys215  
       2020-12-09 09:34:57 +08:00
    用$request->all()可以获取所有数据,用它提供的方法,不要自己通过魔术变量$_POST 获取
    ben1024
        18
    ben1024  
       2020-12-09 09:40:42 +08:00
    用 dd() 试试
    Unicorns96
        19
    Unicorns96  
       2020-12-09 10:16:12 +08:00
    request 打印出来看看
    sunorg
        20
    sunorg  
    OP
       2020-12-09 10:19:15 +08:00
    @zachlhb 已经是了。 一样无用

    @weirdo 还是无用-,- 全 json 形式的话,其他伙伴配合改动大,只能继续_POST

    @skys215 试过,但最终还是封装一个以前的 POST 过滤类,操作_post

    @ben1024 dd 一样的结果。 还出现过再 7.x 系列,api 下 dd 有问题的情况。。



    已经检查过中间件、路由配置等,暂时每发现问题,这代码不是从 0 开始,所以还得继续折磨。 接下来验证下是否是当前 santcum 的版本同时支持 spa 和 api 带来的一些副作用。
    agdhole
        21
    agdhole  
       2020-12-09 10:22:38 +08:00 via iPhone
    看起来是中间件出了故障
    ben1024
        22
    ben1024  
       2020-12-09 10:37:14 +08:00
    @sunorg
    排查下构造函数和拦截器有没有做流处理,把全局变量清理了
    cgpiao
        23
    cgpiao  
       2020-12-09 10:45:30 +08:00
    设置 Content-Type 看看。
    cbasil
        24
    cbasil  
       2020-12-09 11:04:05 +08:00
    has(input)只会检测 input 是否存在,而不会检测他的只是否为空,如果你想要判断一个值在请求中是否存在,并且不为空,可以使用 filled 方法:
    if ($request->filled('name')) {
    //
    }
    skys215
        25
    skys215  
       2020-12-10 10:19:25 +08:00
    你在 index.php 第 2 行把$_POST 打印出来看看
    如果存在,则说明是代码中的某个位置把它删除了
    如果不存在,就不是代码的问题了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2378 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:24 PVG 09:24 LAX 18:24 JFK 21:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86