2015-07-11 83 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