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

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

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

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

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

    接口文件

      public function createUser(Request $request)
      {
            var_dump($_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, 我一定疯魔了,眼花你的有值。 看来我得拿一个全新的项目来跟踪了…
    vacker
        8
    vacker  
       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   ·   实用小工具   ·   1119 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:46 · PVG 02:46 · LAX 10:46 · JFK 13:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.