2016-03-02 146 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)会怎样? –

相关问题