redirect 如何重定向至POST链接?

重定向至这个路由需要传递body参数,要怎么传递?
redirect 如何重定向至POST

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 17

翻完源码,发现框架并不允许重定向时携带参数,而且,只能重定向至GET请求的Path。所以,单一依赖redirect方法的话,是行不通的。但是,我可以提供几种曲线救国的方案,你可以参考下:

Plan A

  • 将参数通过http_build_query($request->all())方法转化为url冒号后的参数,形如name=Mike&age=10
  • 然后将转化后的参数拼接到需要重定向路由的后面,形如/oauth/token?name=Mike&age=10
  • 最后return redirect($url),就可以在另一个接口中通过$request->all()方法接收到参数了。

Plan B

  • 将参数通过return redirect('/oauth/token')->with('body', $request->all())的方式,闪存到session中。
  • 最后在oauth/token接口中,可以通过session('body')的方式,获取到参数了。这个闪存的参数是一次性的,所以不用担心会占用过多的存储空间。

Plan C

  • 通过return redirect()->action('UserController@oauthToken', $request->all())的方式,直接调用目标路由对应的控制器中的方法,顺带传参数。

Plan D

  • 直接在当前路由中,调用return app()->make('UserController')->oauthToken($request),看上去与上面的方案差不多,但是,这个方案可以跨过 重定向只能是GET请求 的限制。

希望这个答案对你有帮助。

3年前 评论
long0 (楼主) 3年前
LiamHao (作者) 3年前

没给场景,我脑补一下吧。 /oauth/token 这个路由应该是在 API 认证中,通过授权码来获取登录凭据 token 这一步的。也就是 应用A认证中心B 颁发登录凭证。这是两个服务之间的通信,需要接收响应数据的。而 redirect 是转交给浏览器来跳转,跳转后就落地到目标系统了,不存在接收响应数据的情况。所以这里应该是楼主理解错了 oauth 的认证流程 ,不应该用 redirect ,而是做服务端请求。

建议先摸清楚 oauth 认证的逻辑与原理,如果是在研究这一块的内容,那么最好先起两个服务用来区分应用与认证中心,否则很容易掉到这个坑里。

3年前 评论
long0 (楼主) 3年前
slpi1 (作者) 3年前
slpi1 (作者) 3年前
long0 (楼主) 3年前
slpi1 (作者) 3年前
long0 (楼主) 3年前
slpi1 (作者) 3年前
long0 (楼主) 3年前
slpi1 (作者) 3年前

参考官方文档:将授权码转化为访问令牌 部分:

    $http = new GuzzleHttp\Client;
    // 这里是POST请求,应该满足你的需求
    $response = $http->post('http://your-app.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => 'client-id',
            'client_secret' => 'client-secret',
            'redirect_uri' => 'http://example.com/callback',
            'code' => $request->code,
        ],
    ]);
3年前 评论
随波逐流

使用GuzzleHttp客户端就行了呀, 获取到结果集合在redirect不行么.

3年前 评论

楼主最后是怎么拿到token的,GuzzleHttp 好像是不能请求项目内的接口

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!