簡體   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