2016-03-02 148 views
3

我正在構建一個具有AWS和Google Cloud相同功能的應用程序。例如創建實例,從機器ID啓動實例,創建快照,引用所有實例等。我使用REST調用進行呼叫。 例如:使用相同REST調用的不同動作

<form method="post" action="rest/create/new" class="form-inline"> 
      <label for="user">User Name</label> <input type="text" id="user" 
       name="user" class="form-control" size="50" 
       placeholder="Enter Username"> 
      <button type="submit" class="btn btn-info">Start New Machine</button> 
     </form> 
     <form method="post" action="rest/launch/start" class="form-inline"> 
      <label for="AMId">Launch Existing Machine</label><br> <input 
       type="text" id="AMId" name="AMId" class="form-control" size="50" 
       placeholder="Enter Instance ID"> 
      <button type="submit" class="btn btn-info">Launch</button> 
      <br> 
     </form> 
     <br> <br> 

     <form method="get" action="rest/create/listAll" class="form-inline"> 
      <label>Show All EC2 Instances</label><br> 
      <button type="submit" class="btn btn-info btn-lg">Show All</button> 
     </form> 
     <br> <br> 

     <form method="post" **action="rest/create/listRunning"**> 
      <label>Show All Running EC2 Instances</label><br> 
      <button type="submit" class="btn btn-info">Show All Running</button> 
     </form> 
     <br> <br> 

     <form method="post" action="rest/create/terminate" class="form-inline"> 
      <label for="terminateID">Enter Instance ID</label><br> <input 
       type="text" id="terminateID" name="terminateID" class="form-control" 
       size="50" placeholder="Enter Machine ID"> 
      <button type="submit" class="btn btn-info">Terminate</button> 
     </form> 
     <br> <br> 

而且我趕上在課堂上這些REST調用。 例如,

@GET 
    @Path("/listAll") 
    public Response getAllAvailableImages(@Context ServletContext context) 

現在我想的是我怎麼能同時使用AWS和谷歌的雲功能,使用這些相同的呼叫或其他方法,根據要求或選擇?

回答

1

如何:

GET /{provider}/images 
POST /{provider}/images/{imageID}/start 

其中括號中的變量是路徑參數佔位符:

{供應商}可以解析到AWS,谷歌或其他提供商

{圖像標識}引用獨特圖片ID

例子:

GET /AWS/images (gets all AWS images) 
POST /GoogleCloud/images (creates new Google Cloud image) 
POST /OpenStack/images/gfhdh45ff4/terminate (terminates a specific image) 

如果您在使用Spring MVC對REST,控制器可能看起來像:

@RestController 
public class ImageController { 

    @Autowired 
    private ImageService imageService; 

    @RequestMapping(value = "/{provider}", method = RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public List<Image> getImages(@PathVariable String provider) { 
     return imageService.getImagesByProvider(provider); 
    } 

    @RequestMapping(value = "/{provider}", method = RequestMethod.POST) 
    @ResponseStatus(HttpStatus.CREATED) 
    public Image createNewImage(@PathVariable String provider, @RequestBody Image image) { 
     return imageService.createImageForProvider(provider, image); 
    } 

    @RequestMapping(value = "/{provider}/images/{imageId}/start", method = RequestMethod.PUT) 
    @ResponseStatus(HttpStatus.NO_CONTENT) 
    public void startImageAtProvider(@PathVariable String provider, @PathVariable String imageId) { 
     return imageService.startImageAtProvider(provider, imageId); 
    } 

} 

開始圖像可能是POST的HTTP方法 - 應該是如果開始的圖像不是冪等。但我假設試圖啓動一個已經運行的圖像將被忽略。

額外編輯:

如果圖像ID的所有供應商都是獨一無二的,你可以縮短REST的URL關於圖片:

POST /images/gfhdh45ff4/terminate (terminates a specific image) 
+0

我們怎麼辦稱他們爲(括號{}),你能給我一個鏈接,可以詳細解釋它? –

+1

我已經解釋了佔位符並添加了一個Spring MVC示例。 – morsor

+0

它解釋了很多。但是,你能告訴我,如果兩者都是POST類型(即getImages和createNewImage)會怎樣? –

相關問題