使用Laravel请求对象设置发布数据

时间:2014-12-04 11:37:23

标签: php laravel

我正在尝试测试Laravel API端点,并希望在代码中调用它。

    $request = Request::create( $path, $method );
    $response = Route::dispatch( $request );

此代码段适用于GET,但我也需要能够设置POST调用。将$方法设置为POST也可以,但我找不到详细说明如何附加帖子数据的文档。

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

正如您在评论中提到的,您可以使用$this->call(),但实际上您也可以使用当前代码。如果您查看Request::create()函数的签名,您可以看到它需要$parameters作为第三个参数:

public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)

docblock说:The query (GET) or request (POST) parameters

因此,您只需将数据添加到Request::create()

即可
$data = array('foo' => 'bar');
$request = Request::create( $path, $method, $data );
$response = Route::dispatch( $request );

答案 1 :(得分:1)

我花了将近一天的时间来尝试通过护照和Angular前端进行社交身份验证。

当我使用Restlet API客户端发出请求时,我总是得到成功的响应。 Restlet Client Request

Restlet client response

但是使用下面的内部请求方法总是给我一个错误。

$request = Request::create(
    '/oauth/token',
    'POST',
    [
        'grant_type' => 'social',
        'client_id' => 'your_oauth_client_id',
        'client_secret' => 'your_oauth_client_secret',
        'provider' => 'social_auth_provider', // e.g facebook, google
        'access_token' => 'access_token', // access token issued by specified provider
    ]
);

$response = Route::dispatch($request);
$content = json_decode($response->getContent(), true);
if (! $response->isSuccessful()) {
    return response()->json($content, 401);
}

return response()->json([
    'content' => $content,
    'access_token' => $content['access_token'],
    'refresh_token' => $content['refresh_token'],
    'token_type' => $content['token_type'],
    'expires_at' => Carbon::parse(
        $content['expires_in']
    )->toDateTimeString()
]);

此特定错误:

{
    error: "unsupported_grant_type",
    error_description: "The authorization grant type is not supported by the 
    authorization server.",
    hint: "Check that all required parameters have been provided",
    message: "The authorization grant type is not supported by the authorization server."
}

我感觉到它与请求中发送表单数据的方式有关,因此在寻找一种适当的方式来在laravel中发出此类内部请求时,我遇到了一个示例项目,并提供了一个可行的实现:{{ 3}}。

总之,这是操作方法:

$proxy = Request::create(
    '/oauth/token',
    'POST',
    [
        'grant_type' => 'social',
        'client_id' => 'your_oauth_client_id',
        'client_secret' => 'your_oauth_client_secret',
        'provider' => 'social_auth_provider', // e.g facebook, google
        'access_token' => 'access_token', // access token issued by specified provider
    ]
);

return app()->handle($proxy);

希望这会有所帮助。