2015-07-11 47 views
0

我開發並部署了一個web api。它適用於單元測試並使用fiddler。但是,如果我創建單獨的項目並嘗試向其發佈數據,則會發回400錯誤請求錯誤。我正在尋找一種方法來發布這個自定義對象使用C#編寫的客戶端。與WCF不同,沒有matadata可以創建這些對象的代理,然後實例化並將其傳遞給調用方法。你如何將客戶這樣的自定義對象作爲參數傳遞給方法?如何使用C將POST自定義對象POST到web api#

URL會http://host/directory/api/customer/AddNewCustomer 和方法的定義是類似

[HttpPost] 
public bool AddNewCustomer(Customer customerObj) 

編輯

以下是我的客戶端代碼

HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://host/directory/"); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
client.Timeout = TimeSpan.FromSeconds(30.0); 

// strong typed instance 
var values = new JObject(); 
values.Add("FirstName", "John"); 
values.Add("LastName", "Doe"); 

HttpContent content = new StringContent(values.ToString(), Encoding.UTF8,"application/json"); 

var response = client.PostAsJsonAsync("api/customer/AddNewCustomer", content).Result; 
+0

您確定您發送的是發佈的請求,而不是其他類型嗎? – KnightFox

+0

你試過這個嗎? http://stackoverflow.com/questions/4088625/net-simplest-way-to-send-post-with-data-and-read-response –

+0

請檢查與提琴手,你實際上發送你的JSON'內容類型:application/json'和header-Length:{lengthOfYourContent}'。它們是WebApi成功處理它們的必要條件 – Martin

回答

1

嘗試了很多解決方案之後,usign fiddler我才知道內容對象沒有設置。這很奇怪,但事實就是如此。所以我試圖直接傳遞JOBject而不是將其投射到HttpContent並且它工作

// strong typed instance 
var values = new JObject(); 
values.Add("FirstName", "John"); 
values.Add("LastName", "Doe"); 

// this is not set!!! 
HttpContent content = new StringContent(values.ToString(), Encoding.UTF8,"application/json"); 

var response = client.PostAsJsonAsync("api/customer/AddNewCustomer", values).Result; 
1

理想客戶是在一個單獨的類庫模型,你可以在項目之間共享這個dll。但是任何具有相同屬性名稱的對象都可以工作,因爲Web API會將它們序列化爲Json或xml並自動創建映射。

+0

Ok ,那正是我在想什麼。我曾嘗試使用具有類似屬性名稱abd的JObject,但仍得到相同的響應。如果可能,你可以分享任何代碼片段嗎? – Salman

+0

將您的客戶端代碼發佈到創建對象併發出請求的位置。 – Crowcoder

+0

values.ToString()的結果是否與你放入Fiddler的內容相匹配? – Crowcoder

相關問題