繁体   English   中英

如何从C#服务器中的POST(或其他HTTP)请求访问参数?

[英]How can I access parameters from a POST (or other HTTP) request in a C# server?

我正在使用ASP.Net Core构建Reactjs应用程序,而我对此是全新的。 我有一个JS组件(据我所知)正在向C#服务器控制器发出适当的提取请求(POST)。 服务器确定接收该请求。 但是,我绝对不知道如何访问请求的参数(我正在通过正文传递)。

我尝试使用[FromBody]直接访问主体。 我还尝试利用Request.Body,Request.Form,Request.Query,Request.Params等。我尝试遵循在网上找到的指导方针,似乎可以解决我的问题。 他们中的几个完全没有用。 他们中的大多数都使用我当前的库中不可用的关键字,类等,并且它们未列出适当的库。 就我所知,我已经偶然发现了正确的答案。 但是对于像我这样具有高度逻辑思维但又在该领域几乎没有经验的人来说,我无法全神贯注。

我在JavaScript中使用提取的POST请求:

fetch('api/Database/PushStatus',
    {
        method: 'post',
        headers: { 'Content-type': 'application/json' },
        body: JSON.stringify({ order: this.state.orderNum, status: this.state.newStatus })
    }
).then(response => {
    response.json().then(data => {
        this.setState({ reqCheck: "" + response, didPush: false });
    })
}).catch(err => {
    this.setState({ reqCheck: "Failure! (js)", didPush: false })
});

我在C#服务器上的请求处理:

[Route("api/[controller]/[action]")]
public class DatabaseController : Controller
{
    string conStri = "Data Source=ADM293\\MSSQLSERVER01;Initial Catalog=testDB;User ID=sa;Password=password.1";
    SqlConnection cnct = null;

    [HttpPost]
    public void PushStatus(string order, string status)
    {
        cnct = new SqlConnection(conStri);
        SqlCommand command = new SqlCommand("insert into testTable values ('" + order + "', '" + status + "');", cnct);

        using (cnct)
        {
            cnct.Open();
            int result = command.ExecuteNonQuery();
            cnct.Close();
        }
    }
}

我希望使用this.state.orderNumthis.state.newStatus的内容更新服务器。 相反,我的服务器使用空字符串值更新(这很合理)。

您可以创建一个代表请求的类:

public class PushStatusRequest
{
    public string Order { get; set; }
    public string Status { get; set; }
}

并像这样使用它:

[HttpPost]        
public void PushStatus([FromBody] PushStatusRequest request){
   //request.Status
   //request.Order
}

@Anteo是正确的。 但我想补充一些解释。 您已经遇到了两种将参数传递给控制器​​的方法。 您尝试使用正文(在请求中设置正文)作为入口,并使用查询(在控制器中)作为输出。

好吧, 主体是一种类型,它需要在Controller端是某种模型。 使用[FromBody]自动将请求中的数据检索到模型中。 遵循相同的命名策略(忽略大小写),将此模型创建为一个单独的类。

然后, 查询字符串就是您在控制器端使用的字符串 在请求方面,它遵循如下URL: https://host:port/route/to/then/query/params 因此,如果我不认为基本URLhttps://host:port 剩下的只是一个查询字符串 其中一部分已映射到控制器操作的路由。 剩下的任何内容都被解释为有用的信息,并映射到操作参数。

因此,现在是您选择(取决于orderNumnewStatus的长度)使用哪种方法的时候了。 我建议使用正文,因为它是比路由更多的数据。

另外,如果您继承[ControllerBase][1] ,则可以使用Request属性来访问请求本身。 但是请注意这里。

附言:我建议您阅读有关请求,表单数据,正文,查询等内容的更多信息。

如果还有其他问题,请随时提出。

默认情况下,大写在JavaScript和C#之间更改。 因此,您可能只需要更改方法签名:

public void PushStatus(string Order, string Status)

就是说,按照@Anteo建议的方式上课通常更好。 另外,我假设您只是为了清楚起见放置了SqlConnection 你不应该在控制器中这样做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM