簡體   English   中英

在正文中發送字符串作為 POST REST 調用(javascript 到 Asp.Net Core)

[英]Send string in body as a POST REST call (javascript to Asp.Net Core)

我有一個用 Asp.Net Core 編寫的簡單后端 API,它接收一個字符串:

        [HttpPost]
        public IResult Post([FromBody] string value)
        {
            //do something with value...
        }

而我的前端 javascript 看起來是這樣的:

      const request = {
        method: 'POST',
        mode : "cors",
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ amount, currency })
      };
      const response = await fetch(link, request);
      const data = await response.json();

這似乎很容易,但我收到以下錯誤:
“解析值時遇到意外字符:{. Path '', line 1, position 1。”
“值字段是必需的。”

問題出在正文中,即作為 JSON object 發送:
{“金額”:123,“貨幣”:“歐元”}

顯然解析會產生問題。
如果使用 Postman,我將這個字符串發送到正文中:
"{ \"金額\":123, \"貨幣\":\"歐元\"}"

一切正常!

如果我通過 javascript 發送它,它不會:(

所以,我的問題是:顯然 c# 弄亂了正文中的數據類型。 它期待一個字符串,但它正在接收一個 JSON (盡管 JSON.stringfy 是一個字符串,但不知何故它似乎被解析回 Z0ECD11C1D7A287401D148A23BBD7A2F8 之間的某個地方)。

我可以將 C# 上的類型更改為 JSON 之類的類型,並且一切都會自動運行嗎? 有沒有辦法通過 javascript 發送一個 JSON 看起來字符串,而不會在兩者之間進行這種不需要的轉換?


附加信息:

@StrikeGently 方式不起作用。 我收到一條錯誤消息,指出只能使用 [FromBody] 屬性傳遞 1 個參數。

@joacoleza 方式可能有效,但我想避免它,因為它會在我的代碼中填充數十個描述 function 輸入的小類。

這行得通。 但我的眼睛在流血:

        body:"'" + JSON.stringify({amount, currency}) + "'"

這是傳遞字符串的最優雅的解決方案嗎?

它期望一個string作為value ,但你給它一個 object。 您可以更改方法的參數以接受具有amountcurrency屬性的 object,也可以更改方法的參數以接受兩個同名的變量。

[HttpPost]
public IResult Post([FromBody] int amount, [FromBody] string currency)
{
    //do something
}

嘗試這樣做。

像這樣發送請求:

const request = {
    method: 'POST',
    mode : "cors",
    headers: { 'Content-Type': 'application/json' },
    body: { amount: 100, currency: 'USD' })
  };
const response = await fetch(link, request);
const data = await response.json();

並定義一個可以綁定到您要發送的正文的 class :

public class MyClass
{
    public int Amount { get; set; }
    public string Currency  { get; set; }
}

並使用 class 作為 POST 方法的參數:

[HttpPost]
public IResult Post([FromBody] MyClass data)
{
    //do something with value...
}

即使@joacoleza 的答案確實有效,但在我的一種情況下是不可行的(我收到的 object 很大(約 200 個字段),我只需要提取 5 個。而且它可能會經常變化,我會有調整我的 object 即使我並沒有真正受到這些變化的影響。

我終於自己找到了解決方案:

如前所述,.Net 嘗試將正文的內容解析為請求的 object:

public ActionResult Post([FromBody] string value)

這需要一個字符串 object。 如果我們要發送一個JSON然后解析,可以這樣發送: '{"field":"value", "field2":"value2"}'

但是,如果我們不控制請求中的正文內容,並且我們收到 X object(或我們可能希望在運行時解析的其他 object),我們只需將 ZC1C425268E68385D1AB5Z44 參數的類型更改為 JC1C425268E68385D1AB5074FObject:

public ActionResult Post([FromBody] JObject value)

解析后的 JObject 將包含 JSON 的整個結構,但它仍然會給我們足夠的自由來使用原始版本做任何我們想做的事情,而不必為了轉換而將其轉換為 POCO: var amount = value["amount"];

這就是我一直在尋找的。

暫無
暫無

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

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