簡體   English   中英

發送對象數組時,Web API [FromBody]參數為null

[英]Web API [FromBody] parameter is null when sending an array of objects

我似乎已經遇到了Web API的一個有趣的問題-使用此控制器操作,在左花括號處有一個斷點來檢查thing

[HttpPut]
public void Test([FromBody]object thing)
{
}

如果我提交以下請求(作為CURL),則會得到期望值,該期望值是包含主體數據的JObject:

curl -X PUT -H "Content-Type: application/json" -d '{
    "Name": "Joe",
    "Key": { "Key": "Value" }
}' "http://localhost/api/TestController/Test"

也就是說,其中Name是Joe且Key是另一個包含Key = Value對象的匿名對象。

但是,如果我稍稍更改此設置以改為提交Keys數組,則會得到null 沒有錯誤,只是null

curl -X PUT -H "Content-Type: application/json" -d '{
    "Name": "Joe",
    "Keys": [{ "Key": "Value" }]
}' "http://localhost/api/TestController/Test"

為什么會這樣呢? HTTP動詞似乎無關緊要(我嘗試過POST和PUT),並且使用dynamic代替object是同一回事。

這是一些屏幕截圖: 在此處輸入圖片說明 在此處輸入圖片說明

在Postman中進行測試時,您的代碼工作正常。

在此處輸入圖片說明

在此處輸入圖片說明

原來我在代碼中的其他位置將MaxDepth的全局JSON設置設置為2 ,該設置在控制器動作之前運行。 為什么它返回null而不是空對象的原因仍然不在我的范圍內,但是將其更改為3可以解決問題並按預期運行。

抱歉給大家帶來的困擾,謝謝您的回答!

我認為這完全取決於您希望如何使用它,如果您想獲得一個強類型化的模型,您可以隨時創建一個像user3658685所說的模型。

您可以做的另一件事是將數據綁定到JObject,然后使用Newton-soft Serializer進行序列化:

public void Post([FromBody] JObject value)
{ 
    //instead of object you can use any type you wish to cast
    object obj = value.ToObject<object>();
}

WebApi使用模型映射類來嘗試使用WebApi方法的參數映射json對象。 您可以通過創建一個具有與json對象匹配的所有屬性的類來解決此問題。

public class Contract {
   public string Name { get; set; }
   public dynamic[] Keys { get; set; }
}

並更改您的WebApi方法的簽名

public void Post([FromBody] Contract value)
{
}

暫無
暫無

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

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