Postman 因未知原因被重定向,路由不工作/ Codeigniter 4

t9aqgxwy  于 2022-12-07  发布在  Postman
关注(0)|答案(1)|浏览(276)

我可以看到 Postman 由于某种原因被重定向了。我刚刚开始使用 Postman ,所以不确定一个正常的请求会是什么样子。当我发出以下请求时;

POST https://development.example.com/Api/Register
form-data
KEY name
VALUE Thomas
KEY _method
VALUE PUT

由于某种原因,它返回了我的网站的首页。当我查看apache 2日志文件时,我可以看到:

124.xxx.xxx.xxx - - [27/Feb/2022:09:08:36 +0000] "POST /Api/Register HTTP/1.1" 303 5724 "-" "PostmanRuntime/7.28.4"

124.xxx.xxx.xxx - - [27/Feb/2022:09:08:36 +0000] "GET / HTTP/1.1" 200 8185 "https://development.example.com/Api/Register" "PostmanRuntime/7.28.4"

当我通过chrome这样的web浏览器访问它时(当然我不能提交任何值),我得到的低于预期的值;

{
   "status": 500,
   "message": {
       "name": "The name field is required",
       "email": "The email field is required",
       "password": "The password field is required.",
       "password_confirmation": "The password_confirmation field is required."
   },
   "error": true,
   "data": []
}

请问我对《 Postman 》做错了什么?
我的Users控制器是;

public function userRegister(){
    $user = new UserEntity($this->request->getPost());
    $user->startActivation();
    if ($this->UserModel->insert($user)){
        $this->sendActivationEmail($user);
        $response =[
            'status'    => 200,
            'message'   => 'User registed.  Check email to activate account.',
            'error'     => false,
            'data'      => []
        ];
    } else {
        $response =[
            'status'    => 500,
            'message'   => $this->UserModel->errors(),
            'error'     => true,
            'data'      => []
        ];
    }
    return $this->respondCreated($response);
}

同样令人困惑的是,这条路线是不可通过的;
我的路线文件是;

$routes->group('Api', ["namespace" => 'App\Controllers\Api\v1'] , function($routes){
    $routes->post('Register', 'Users::userRegister');
});

https://development.example.com/Api/Register
Error;  Controller or its method is not found: \App\Controllers\Api\Register::index

https://development.example.com/Api/v1/Users/userRegister 
This will work and give correct error like way above.
w7t8yxp5

w7t8yxp51#

问题在于,您实际上是在Postman_method PUT)中发出一个PUT请求,而您在文件app/Config/Routes.php*中的路由定义只 * 响应POST请求($routes->post('Register', 'Users::userRegister');)。
要解决此问题,请从Postman中删除_method POST请求参数:

POST https://development.example.com/Api/Register
form-data
KEY name
VALUE Thomas
附录
  • 您问题中看似POST Postman的请求正被Codeigniter框架隐式解释PUT请求,原因是HTTP方法欺骗*。

HTTP方法欺骗
当使用HTML表单时,您只能使用GET或POST HTTP动词。在大多数情况下,这样做就可以了。但是,要支持REST风格的路由,您需要支持其他更正确的动词,如DELETE或PUT。由于浏览器不支持这些动词,CodeIgniter为您提供了一种方法来欺骗正在使用的方法。这允许您发出POST请求,但是告诉应用程序应该将其视为不同的请求类型。
为了欺骗该方法,我们向表单中添加了一个名为_method的隐藏输入,它的值是您希望请求成为的HTTP predicate :

<form action="" method="post">
       <input type="hidden" name="_method" value="PUT" />
   </form>

这种形式被转换成PUT请求,就路由和IncomingRequest类而言,它是一个真正的PUT请求。
您正在使用的表单必须是POST请求。GET请求不能被欺骗。

相关问题