2016-03-04 162 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