在 Web API 应用程序中响应 HTTP Post 调用时,我应该使用“[FromBody]”值还是自定义参数?

Should I use "[FromBody]" values or custom params when responding to an HTTP Post call in a Web API app?

POST 是正确的 HTTP method/verb 用于告诉服务器使用哪些条件检索数据然后将其保存在本地吗?

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

为此,我向 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.
}

这是 right/better 的方法,还是最好从“[FromBody]”中提取 URL 参数?事实上,POST 甚至是用于此类事情的正确 HTTP 动词吗?

为你的行为选择正确的动词总是值得商榷的。如果你看RFC 7231的4.3.3项:

The POST method requests that the target resource process the
representation enclosed in the request according to the resource's
own specific semantics. For example, POST is used for the following
functions (among others):

  • Providing a block of data, such as the fields entered into an HTML form, to a data-handling process;

其中的关键字以粗体突出显示。如您所见,它非常适合您的情况,您发送一个 POST 请求,其中包含一些 数据块 和一些 process通过你的 API.

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

PriceComplianceDTO:

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 中删除您发布的自定义路由。我刚刚创建了一个新网站 API,这是我的默认路由,它与 POST:

一起工作
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);