【问题标题】:How can I access parameters from a POST (or other HTTP) request in a C# server?如何从 C# 服务器中的 POST(或其他 HTTP)请求访问参数?
【发布时间】:2019-05-13 22:14:40
【问题描述】:

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

我尝试使用 [FromBody] 直接访问正文。我还尝试使用 Request.Body、Request.Form、Request.Query、Request.Params 等。我尝试遵循我在网上找到的似乎试图解决我的问题的指南.其中有几个完全没有工作。他们中的大多数都在使用我当前的库中没有的关键字、类等,并且他们没有列出适当的库。据我所知,我已经偶然发现了正确的答案。但是对于像我这样具有高度逻辑思维但在该领域几乎为零经验的人来说,我无法将其全部考虑在内。

我在 JavaScript 中使用 fetch 的 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 的内容更新我的服务器。 相反,我的服务器使用空字符串值更新(这很有意义)。

【问题讨论】:

  • Request.QueryString 产生一个空字符串,HttpContext.Request.QueryString 也是如此,以防万一。

标签: javascript c# reactjs asp.net-core


【解决方案1】:

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

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、Felix 和cyberpug2077 的一切对我来说都是新的。
【解决方案2】:

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

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

然后,查询字符串就是您在控制器端使用的。在请求端,它遵循如下 URL:https://host:port/route/to/then/query/params。所以,如果我没记错的话,base URLhttps://host:port 的一部分。剩下的就是一个查询字符串。其中一部分被映射到控制器操作的路由。剩下的任何东西都被解释为有用的信息并映射到一个动作参数。

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

另外,如果你继承[ControllerBase][1],那么你可以使用Request 属性来访问请求本身。但是这里要小心。

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

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

【讨论】:

    【解决方案3】:

    默认情况下,JavaScript 和 C# 之间的大小写会发生变化。因此,您可能只需要更改方法签名:

    public void PushStatus(string Order, string Status)
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多