Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 我是否应该使用“;[FromBody]”引用;在Web API应用程序中响应HTTP Post调用时的值或自定义参数?_Asp.net Web Api_Http Post_Asp.net Web Api Routing_Http Post Vars_Frombodyattribute - Fatal编程技术网

Asp.net web api 我是否应该使用“;[FromBody]”引用;在Web API应用程序中响应HTTP Post调用时的值或自定义参数?

Asp.net web api 我是否应该使用“;[FromBody]”引用;在Web API应用程序中响应HTTP Post调用时的值或自定义参数?,asp.net-web-api,http-post,asp.net-web-api-routing,http-post-vars,frombodyattribute,Asp.net Web Api,Http Post,Asp.net Web Api Routing,Http Post Vars,Frombodyattribute,POST是用于告诉服务器使用哪些条件来检索数据并在本地保存数据的正确HTTP方法/动词吗 我想将一个URL从客户端(Windows窗体)app/util发送到我的Web API app,告诉它通过存储的Proc检索数据,然后将结果存储在本地表中。没有数据返回给调用者,它只是一个做一些工作的通知 为了做好准备,我向WebApiConfig添加了一个新路由: // Some reports (monthly) only need a begindate, such as "201509"; othe

POST是用于告诉服务器使用哪些条件来检索数据并在本地保存数据的正确HTTP方法/动词吗

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

为了做好准备,我向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 }
);
在控制器中,此方法已存在(已自动添加):

…但我不知道我是否想要“[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参数从“[FromBody]”中拉出?事实上,POST是用于这类事情的正确HTTP动词吗?

为您的行为选择正确的动词的问题总是有争议的。如果您查看的第4.3.3项:

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
    }
}
POST方法要求目标资源处理
根据资源的
拥有特定的语义。例如,POST用于以下内容
职能(除其他外):

  • 提供数据块,例如输入到 HTML 表单,用于数据处理过程
中的关键字以粗体突出显示。正如您所看到的,它非常适合您的情况,您发送一个POST请求,其中包含一些数据块,而一些过程是由您的API生成的

关于如何处理帖子中的参数。您可以创建一个DTO来映射字段:
Unit、BeginDate、EndDate
。由于您是从body发送参数,WebAPI将使用
格式化程序绑定参数。WebAPI将根据
内容类型标题选择更好的格式化程序。
在我提供的示例中,使用的格式化程序将是JSON.Net(JSON的默认格式)

价格符合以下要求:

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
    }
}
控制器

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 }
);

我认为这篇文章适合你。但是,我真的不知道你为什么要为此创建一条路线。我最常做的是将帖子与json字符串一起发送。然后,使用相同的字段创建DTO,就可以开始了。不需要FromBody。我想这取决于你对“数据”的定义;从某种意义上讲,这不是存储在表中的数据,而是URL上的args(RESTful的“地址”如“是的。正如我所说,这是非常有争议的。但我认为在他的情况下,POST将是最好的方法,因为在他的过程中(我认为)使用args来处理数据。是的,我肯定在使用POST;我的问题是:我应该使用标准吗?”[FromBody]“方法,或接受URL上对应值的自定义Post方法?@B.ClayShannon我刚刚用一个没有[FromBody]的Post示例更新了我的答案。刚刚做了一个测试项目:)