2017-10-06 28 views
0

我有這個AngularJS HTTP調用ASP.Net網絡API,POST多個對象

$http({ 
     method: "POST", 
     url: Helper.ApiUrl() + '/Api/Case/SendCase', 
     data: { obecttype1, obj2, obj3}, 
       }).then(function mySuccess(response) {}); 

螞蟻這個ASP.net的Web API方法

[HttpPost] 
[Route("Api/Path/SendCase")] 
public int SendCase(object application) 
{ 

string applicantName = ((Newtonsoft.Json.Linq.JObject)application)["applicant"].ToString(); 

obecttype1 obj = JsonConvert.DeserializeObject<obecttype1>(((Newtonsoft.Json.Linq.JObject)application)["obecttype1"].ToString()); 

    ......................... 
    return ID; 
    } 

這工作得很好,但我覺得這是有點髒因爲我解析我在我的方法的對象,所以我的問題是

是的也一路發送多個對象爲在P PARAMS OST的方法,我寧願避免修改我的模型,避免了這

創建一個類,所以我的API方法是這樣的

public int SendCase(class1 obecttype1, class2 obj2, class3 obj3) 
+0

如果不創建一個新類來保存'objecttype1','obj2'和'obj3',這不是你可以做的事情。 –

回答

0

「是也一路發送多個對象爲在PARAMS POST方法,我寧願避免修改我的模型,避免爲此創建一個類「

通過設計HTTP Post只能有一個主體,web api將嘗試將主體轉換爲方法簽名中定義的參數。因此,在正文中發送多個對象並嘗試將這些對象與方法簽名中的多個參數進行匹配將不起作用。爲此,您需要定義一個包含其他類並匹配身體簽名的類。

public class postDTO 
{ 
    public class1 class1Data { get; set; } 
    public class2 class2Data { get; set; } 
    public class3 class3Data { get; set; } 
} 

//The api signature 
public int SendCase(postDTO application) 

如果你還不想添加新的類,然後我會用JObject直接作爲參數,因爲這

[HttpPost] 
public int SendCase(JObject jsonData) 
{ 
    dynamic json = jsonData; 
    JObject class1DataJson = json.class1Data; 
    JObject class2DataJson = json.class2Data; 
    JObject class3DataJson = json.class3Data; 

    var class1Data = class1DataJson.ToObject<class1>(); 
    var class2Data = class2DataJson.ToObject<class2>(); 
    var class3Data = class3DataJson.ToObject<class3>(); 
} 
+0

HTTP Post只能有一個主體,但當您使用Angular Http服務或jQuery Ajax發佈多個對象時(對象必須是鍵值對),它們會被序列化爲JSON字符串(如果您不指定內容類型)。然後,當JSON字符串傳輸到服務器時,ASP.NET Web API將盡力使用模型綁定和媒體類型格式化程序從消息正文中讀取值。因此將多個對象放入1個對象中是沒有必要的。實際上,我使用{key1:value1,key2,value2}指定對象的方式實際上是單個對象,即匿名對象。 –

+0

這只是我的答案的確認,但我認爲這是正確的 –

1

1.定義模型中的參數

public class ClassType1 
{ 
    public int Num1 { get; set; } 
    public string Str1 { get; set; } 
} 

public class ClassType2 
{ 
    public double Test2 { get; set; } 
} 

2.使用模型作爲API控制器方法的參數

// Sorry this example is setup on .Net Core 2.0 but I think the previous 
// versions of Web Api would have similar/same behavior 

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    [HttpPost] 
    public void Post(ClassType1 ct1, ClassType2 ct2) 
    {} 
} 

3發佈時,你的對象裏面的數據{}已經有符合您的控制器方法

jQuery的AJAX定義的參數名稱鍵

 $.ajax({ 
       method: 'post', 
       url: 'http://localhost:53101/api/values', 
       dataType: 'json', 
       data: { 
        // It takes key value pairs 
        ct1: { 
         num1: 1, 
         str1: 'some random string' 
        }, 
        ct2: { 
         test2: 0.34 
        } 
       } 
      }); 

總結,是的,你可以發佈多個對象回服務器,只要

  1. 您可以定義爲每個對象的關鍵,關鍵是T o匹配您在服務器方法中定義的參數名稱。
  2. 對象結構必須匹配。

- 更新 -

就像一個證明,這裏是截圖:

enter image description here

+1

你確定它有效嗎? –

+0

它對我的工作很有幫助。我創建了示例並在發佈之前先對其進行了測試。我只是不知道這是你從一開始就想要的。既然你已經建立了你的環境,例如Web API和Angular,爲什麼你不試試並告訴我它是否正常工作。 –

+0

我附上截圖以顯示它在我的工作... –

1

我們有一個使用DefaultHttpBatchHandler接受多部分的應用POST請求。我相信這有點笨重,原因很多,但它是以結構化方式接受多個對象的內置方式。

https://msdn.microsoft.com/en-us/library/system.web.http.batch.defaulthttpbatchhandler(v=vs.118).aspx

至於腳本創建的東西,我不知道。我們使用此API的調用者是C#服務,它可以使用我們提供的簡單客戶端庫來創建多部分請求,以幫助他們做到這一點。

+0

我會嘗試,聽起來很有趣 –