API方法,不发布任何东西,也没有得到任何东西

时间:2017-04-12 08:07:18

标签: c# rest get asp.net-web-api2 put

我有下一个API方法:

  • 恢复数据库(基于文件名)。
  • 将文件夹A中的内容复制到文件夹B

所以这是API方法,它不发布任何东西,也不返回(获取)任何东西。

我应该使用Post,Put或Get这样的情况吗? 目前我正在使用Get,这样可以吗? 当我们返回一些数据时使用Get是有意义的,但我不需要返回任何数据。 同时我不需要发布任何对象,我只需要标识符。

从基于' id'的服务器上的文件夹恢复和'文件名':

[HttpGet]//**put?
[Route("api/[controller]/[action]/{restoreFileName}")]
public async Task<IActionResult> RestoreDB(string restoreFileName)
{
    //Restore database from folder A on server base on restoreFileName
    return new OkResult();
}

从文件夹A复制到文件夹B:

[HttpGet]//**put?
[Route("api/[controller]/{id}/[action]/{filename}")]
public async Task<IActionResult> CopyFromAtoB(int id, string fileName)
{
       //Copy from folder A to folder B base on 'id' and 'file name'.
       return new OkResult();
}

1 个答案:

答案 0 :(得分:1)

问题是您的API不遵循REST原则。端点应表示可以执行不同操作的资源(GET,POST,PUT,PATCH,DELETE)。你的终点:

[Route("api/[controller]/[action]/{restoreFileName}")]

不代表任何资源。它只是一个URI路径。 controlleractionrestoreFileName都不是资源。

所以,你有两个选择。

  1. 只需忽略任何REST约定,只需创建自己的自定义路径即可。如果选择此选项,则无需执行任何操作。您可以使用任何您想要的动词,任何您想要的命名。但是,即使在这种情况下POST动词是最自然的动词(它确实会对系统进行一些更改)。
  2. 重构您的API以遵循REST。
  3. 如果您选择第二个选项,那么您的路线应如下所示:

    [HttpPost]    
    [Route("api/fileManager/files/{filename}")]
    

    并使用您将在POST正文中发送的命令来区分对文件的操作,例如:{action: "restore"}