2016-03-04 117 views
0

我想更新我定义的(用户)资源之一以更新其当前状态(联机/脱机)和/或位置。所以我会用这样的PUT请求:REST API 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
  1. 通常,相应的动作将通过路由机制发送。我们将在您的json object上有一个action属性,该属性对应于应该发生的功能。

让我们来看看这个:

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

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

  1. 关于整个卖v.s.后 - 没有理由做另一个写作,因为this question thread here有最好的细分和解释到目前为止。

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

+0

1.我正在想这个......你现在证实了......我觉得它觉得某种程度上“不够”或者不喜欢正确的方式......所以多数民众赞成真棒。2)感谢您的链接3)我很惊讶,我应该使用PUT来创建资源,而不是'POST'。这应该改变,然后在我的方法。 – sesc360