404必需的param值未通过时,在Laravel API中出现问题

时间:2017-01-30 22:52:02

标签: php laravel laravel-5.3

请求类

class LoginRequest extends Request
{

    public function authorize() {
        return true;
    }

    public function rules() {
        return [
            'EmailAddress'  => 'required',
            'Password'      => 'required',
        ];
    }

    public function messages() {
        return [
            "EmailAddress.required" => trans("login.RequiredEmailAddress"),
            "Password.required"     => trans("login.RequiredPassword")
        ];
    }
}

路线

Route::post('/AuthenticateUser', 
    array(
        'uses' =>  'API\Login\apiLoginController@AuthenticateUser', 
        'as'   =>  'AuthenticateUser'
    )
);

控制器操作方法

我有一个控制器,到目前为止我只为请求类做了验证输入参数。以下是行动方法

public function AuthenticateUser(LoginRequest $request) {
    dd("Hello");
}

网址

localhost:85/Laravel/public/api/v1/AuthenticateUser

我正在使用Postman Chrome扩展程序来测试Url。因此,我们可以看到在Request类中,电子邮件地址和密码都是必需参数。

当我传递两个参数值时。没有问题,一切正常。当我将电子邮件地址值保持为空时...我收到404错误,这是屏幕截图。

如果没有给出电子邮件地址,我是否遗漏了一些东西来摆脱404错误?我期待输入电子邮件地址

的错误消息

enter image description here

以下是我传递电子邮件和密码时的工作状态

enter image description here

3 个答案:

答案 0 :(得分:1)

解决方案1:

我设法通过在请求中添加以下标头来摆脱404并返回422:

accept:application/json

这实际上不是Laravel中Taylor pointed out的错误,而是一种区分是否是AJAX / API请求的方法。

解决方案2:

或者,如果您不希望客户端指定该标头,则可以创建一个中间件,该中间件将在每个API请求上添加标头accept:application/json。方法如下:

  1. 创建一个新的中间件:app/Http/Middleware/ForceJsonResponse.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ForceJsonResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');

        return $next($request);
    }
}

  1. /app/Http/Kernel.php的{​​{1}}中,为新创建的中间件指定名称空间:
$middlewareGroups.api

答案 1 :(得分:0)

最后通过更改下面的请求类来实现它。

class LoginRequest extends Request
{

    public function wantsJson() {
        return true;
    }

    public function authorize() {
        return true;
    }

    public function rules() {
        return [
            'EmailAddress'  => 'required',
            'Password'      => 'required',
        ];
    }

    public function messages() {
        return [
            "EmailAddress.required" => trans("login.RequiredEmailAddress"),
            "Password.required"     => trans("login.RequiredPassword")
        ];
    }
}

刚刚添加下面的代码。

public function wantsJson() {
    return true;
}

答案 2 :(得分:-2)

这是因为您直接在路由处理上进行验证,而不是通过NotFoundException进行匹配。您需要按原样将请求传递给控制器​​并执行:

$this->validate($request, [
            'EmailAddress'  => 'required|email',
            'Password'      => 'required',
        ]);