簡體   English   中英

在正文中使用 JSON.stringify(obj) 發送 Post 不會在 API 接收端產生字符串

[英]Sending Post with JSON.stringify(obj) in body doesn't result in a string on API recieving side

所以我在這個場景上有點卡住了。
我有一個前端通過 Axios 向我的 API 發送以下請求:

const objectInBody = {
            Id,
            Input
        };
        
        const result: any = await axios.Post(`Order/Reservation`, JSON.stringify(objectInBody));
        return result.data;

我有一個 RESTful .NET Core API 正在運行,可以接收這些請求。
相關路由邏輯:

[HttpPost("[action]")]
        public async Task<IActionResult> Reservation([FromBody] string jsonObj)
        {

            Reservation reservation = JsonConvert.DeserializeObject<Reservation>(jsonObj);

            try
            {
                var result = await orderManager.Reserve(reservation);
                return Ok(result);
            }
            catch (Exception e)
            {
                return BadRequest(e.Message);
            }
        }

這里的問題是,我的 API 阻止了請求,因為我的 API 無法將 'JSON.stringify(objectInBody)' 識別為字符串並且不會運行代碼。
當我傳遞其他字符串時,API 毫無問題地接受它並繼續邏輯。 這對我來說很奇怪,因為我認為 JSON.stringify 結果是字符串類型?

在 console.log(JSON.stringify(objectInBody)); 我得到 {Id:1, Input:1} 沒有引號。
但是當我 console.log(typeof(JSON.stringify(objectInBody))); 它確實在我的控制台中說“字符串”。

我還可以將 API 中的“預期”類型調整為 JsonObject 或其他類型,但這是一個糟糕的“修復”,因為在我看來 Json.Stringify 必須返回一個字符串並毫無問題地傳遞它,就像我說的那樣,當然不是 JsonObject。

您當前的代碼不起作用的原因是因為 Axios 不會為字符串有效負載自動發送Content-Type: application/json 因此,要使您當前的解決方案起作用,您必須這樣做(請按照我在本答案末尾的建議):

const result: any = await axios.post("Order/Reservation", JSON.stringify(objectInBody), {headers: {"Content-Type": "application/json"}});

推薦方案

您應該像這樣更改控制器方法:

[HttpPost("[action]")]
public async Task<IActionResult> Reservation([FromBody] Reservation reservation)
{
    try
    {
        var result = await orderManager.Reserve(reservation);
        return Ok(result);
    }
    catch (Exception e)
    {
        return BadRequest(e.Message);
    }
}

然后像這樣改變你的 Axios 調用:

const result: any = await axios.post(`Order/Reservation`, objectInBody);

假設Reservation類是這樣的

public class Reservation 
{
  public string Id {get; set;}
   public string Input {get; set;}
}

試試這個代碼

objectInBody = {
            Id:"id",
            Input: "input"
        };

 const result: any = await axios.Post('/Order/Reservation',
 { jsonObj:JSON.stringify(objectInBody)});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM