1

POST 是否是正确的 HTTP 方法/动词,用于告诉服务器使用哪个标准来检索数据然后将其保存在本地?

我想从客户端(Windows 窗体)应用程序/实用程序发送一个 URL 到我的 Web API 应用程序,告诉它通过存储过程检索数据,然后将结果存储在本地表中。没有数据返回给调用者,它只是做一些工作的通知。

为此,我向 WebApiConfig 添加了一条新路由:

// Some reports (monthly) only need a begindate, such as "201509"; others need a range 
//  of 2..13 months, such as "2001502" and "201602")
config.Routes.MapHttpRoute(
    name: "ReportsApi",
    routeTemplate: "api/{controller}/{unit}/{begindate}/{enddate}",
    defaults: new { enddate = RouteParameter.Optional }
);

在 Controller 中,此方法已经存在(已自动添加):

// POST: api/PriceCompliance
public void Post([FromBody]string value)
{
}

...但我不知道我是否想要“[FromBody]”爵士乐,所以我添加了这个:

public void Post(String unit, String beginDate, String endDate)
{
    // TODO: Call the corresponding SP (via a Model or directly here?) and store the results in a table.
}

这是正确/更好的方法吗,还是最好将 URL args 从“[FromBody]”中提取出来?事实上,POST 甚至是用于这类事情的正确 HTTP 动词吗?

4

1 回答 1

1

为你的动作选择正确的动词总是有争议的。如果您查看RFC 7231的第 4.3.3 项:

POST 方法请求目标资源 根据资源 自己的特定语义处理请求中包含的表示。例如,POST 用于以下 功能(以及其他功能):


  • 向数据处理过程提供数据块,例如输入 HTML 表单的字段;

其中的关键字以粗体突出显示。正如您所看到的,它非常适合您的情况,您可以在其中发送带有一些数据块的POST 请求,并且某些过程是由您的 API 完成的。

至于如何处理POST 中的参数。您可以创建一个 DTO 来映射您的字段:Unit, BeginDate, EndDate. 由于您是从正文发送参数,因此 WebAPI 将使用Formatter. WebAPI 将根据content-type header.我提供的示例中选择使用更好的格式化程序,使用的格式化程序将是 JSON.Net(这是 JSON 的默认设置)

价格合规DTO

public class PriceComplianceDTO
{
    public string Unit { get; set; }

    public DateTime BeginDate { get; set; }

    public DateTime EndDate { get; set; }
}

控制器

[RoutePrefix("api/v1")]
public class PriceComplianceController : ApiController
{
    [HttpPost]
    [Route("price")]
    public void Post(PriceComplianceDTO data)
    {
        //Call procedure and process data
    }
}

如果您决定使用上述方法,您还可以从 WebApiConfig 中删除您发布的自定义路由。我刚刚创建了一个新的 Web API,这是我的默认路由,它与 POST 一起使用:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
于 2015-12-29T22:11:07.567 回答