REST API PUT请求更新资源

时间:2016-03-04 18:41:08

标签: php api laravel

我想更新我定义的一个资源(用户)以更新其当前状态(在线/离线)和/或位置。因此我会使用像这样的PUT请求:

PUT http://server/v1/users/12345

有效载荷

{
   "status": 0
}
例如,

将状态设置为离线。

或者可能是:

有效载荷

{
   "latitude": 100,
   "longitude": 100
}

后端基于Laravel / PHP,我在控制器中响应此请求:

public function update(Request $request, $userReference) {

        // Get payload from request
        $bodyContent = json_decode($request->getContent(), true);
        $userReference = $userReference;

        // Update the user location
        $updateResponderLocationCommand = new UpdateResponderLocationCommand($bodyContent);
        $this->commandBus->execute($updateResponderLocationCommand);

        $response = [
            'userReference' => $userReference
        ];

        return $this->setStatusCode(201)->respond($response);
    }

此控制器使用我集成的命令系统,它将触发执行更新的任务。

我的问题是,我在哪里挣扎:

  1. 如何区分应执行的命令。现在,只有LocationUpdate在此方法中。但我不想仅为状态更新编写新的更新消息。
  2. 那么请求如何正常工作?我是否仍然可以使用PUT http://server/v1/user/100方法,并在有效负载和选择开关中使用关键字 - 在控制器内部方法区分要执行的任务?
  3. 当我只更新单个组件时,我一直在使用PUT吗?我读过我应该使用POST吗?

1 个答案:

答案 0 :(得分:1)

  1. 通常,相应的操作将通过路由机制发送。我们在action上会有json object属性,该属性与应该发生的功能相对应。
  2. 让我们看一下:

    public function update(....){
        switch($request->get('action'))
        {
            case 'location':
                //execute the command here
                break;
            case 'status':
                //execute the command here
                break;
        }
    }
    

    通过这种方式,我们可以确保根据我们的行动调度我们的commands。这是我喜欢的方法。

    1. 关于整个put vs.s.发布 - 因为this question thread here到目前为止有最好的细分和解释,所以没有理由再写一篇文章。

    2. 您应该参考#2中的链接。创建资源时,应使用PUT。这可以确保请求是幂等的,不会重复(客户端挂起,服务器瓶颈等)。