我正在尝试将我的JSON传递给Web.API服务。当我设置为POST并且我在[FromBody ]
参数内得到值时,发送与Fiddler配合得很好:
Http/1.1
User-Agent: Fiddler
content-type: application/json; charset=utf-8
Host: http://localhost:27701/api/myList
Content-Length: 883
但是当我使用这个C#代码发布JSON时,[FromBody ]
参数为空:
HttpContent content = new StringContent(data);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:27701/api/");
HttpResponseMessage response = client.PostAsync("myList", content).Result;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsAsync<string>().Result;
s = result;
}
数据部分是Fiddler和我的代码中的确切JSON,并且两个调用都调用了控制器。
这是我的JSON:
{
"Id":0,
"Count":0,
"StartDate":"\\/Date(-62135596800000)\\/",
"Address":{
"Id":0,
"State":"test",
"City":"test"
}
}
有一件事是,如果我不在fiddler中的字符串的两边放'
(单引号),[FromBody]
参数为空,但如果我把它们放在C#sample上,则响应为500服务器错误。
答案 0 :(得分:2)
您尚未发布接收方法代码,但根据提供的数据,它应该是一个带有一个参数的方法,该参数是代表您的JSON的对象。在这种情况下,您根本不需要使用FromBody
属性。
如果您查看article,可以找到:
默认情况下,Web API使用以下规则绑定参数:
- 如果参数是“简单”类型,Web API会尝试从URI获取值。简单类型包括.NET基元类型(int,
bool,double等等,加上TimeSpan,DateTime,Guid,decimal,
和字符串,以及具有可转换的类型转换器的任何类型 一个字符串。- 对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值。
我根据你的JSON创建了一个模型:
public class Address
{
public int Id { get; set; }
public string State { get; set; }
public string City { get; set; }
}
public class RootObject
{
public int Id { get; set; }
public int Count { get; set; }
public string StartDate { get; set; } // Keeped as string for simplicity
public Address Address { get; set; }
}
然后真正简单的方法可以接收这样的JSON:
public RootObject Post(RootObject req)
{
return req;
}
然后我用Fiddler测试了它:
Method:
POST
Headers:
Content-Type: application/json
Request Body:
{"Id":0,"Count":0,"StartDate":"\\/Date(-62135596800000)\\/","Address":{"Id":0,"State":"test","City":"test"}}
和C#代码:
var data = "{\"Id\":0,\"Count\":0,\"StartDate\":\"\\/Date(-62135596800000)\\/\",\"Address\":{\"Id\":0,\"State\":\"test\",\"City\":\"test\"}}";
using (var client = new HttpClient())
{
HttpContent content = new StringContent(data);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
HttpResponseMessage response =
client.PostAsync("http://my.url", content).Result;
var result = response.Content.ReadAsStringAsync().Result;
}
在这两种情况下,我都能够将对象送回。
一些提示:
var json = "\"a\":\"b\"";
或
var json = @"""a"":""b""";
。如果你从某个地方收到了JSON
否则你就不需要做任何事了。'
字符包装JSON。