Javascript 将JSON字符串发布到WEB API
我有一个Javascript 将JSON字符串发布到WEB API,javascript,json,asp.net-web-api2,Javascript,Json,Asp.net Web Api2,我有一个ASP.NET WEB-API 2应用程序,它需要有一个POST方法来接受JOSN字符串,该字符串的结构未知,来自javascript 我启用了cors和GET方法,但从客户端发送JSON时,api的方法参数始终为null 这是我的api方法: //parameters i tried: //[FromBody]string model //[FromBody]dynamic model //dynamic model public HttpResponseMessage Post(st
ASP.NET WEB-API 2
应用程序,它需要有一个POST
方法来接受JOSN
字符串,该字符串的结构未知,来自javascript
我启用了cors
和GET
方法,但从客户端发送JSON
时,api的方法参数始终为null
这是我的api
方法:
//parameters i tried:
//[FromBody]string model
//[FromBody]dynamic model
//dynamic model
public HttpResponseMessage Post(string model)
{
return new HttpResponseMessage()
{
Content = new StringContent("POST: Test message: " + model)
};
}
和我的客户方法:
function sendRequest()
{
var Test = {"Name":"some name"};
var method = $('#method').val();
$.ajax({
type: method,
url: serviceUrl,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(Test)
}).done(function (data)
{
$('#value1').text(data);
}).error(function (jqXHR, textStatus, errorThrown)
{
$('#value1').text(jqXHR.responseText || textStatus);
});
}
所以问题是我如何从javascript
发布一个未知的JSON字符串
,并在我的api
方法中将其作为字符串接受?我编辑了你的代码,它工作得很好
[FromBody]属性指定操作参数仅来自传入HTTPRequestMessage的实体体
public class TestApiController : ApiController
{
// POST api/<controller>
[HttpPost]
public HttpResponseMessage Post([FromBody]string value)
{
return new HttpResponseMessage()
{
Content = new StringContent("POST: Test message: " + value)
};
}
}
function sendRequest() {
var Test = { "Name": "some name" };
$.ajax({
type: "POST",
url: "api/TestApi",
data: { '': JSON.stringify(Test) }
}).done(function (data) {
alert(data);
}).error(function (jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText || textStatus);
});
}
public类TestApiController:ApiController
{
//后api/
[HttpPost]
公共HttpResponseMessage Post([FromBody]字符串值)
{
返回新的HttpResponseMessage()
{
内容=新的StringContent(“POST:测试消息:”+值)
};
}
}
函数sendRequest(){
var Test={“Name”:“some Name”};
$.ajax({
类型:“POST”,
url:“api/TestApi”,
数据:{'':JSON.stringify(测试)}
}).完成(功能(数据){
警报(数据);
}).error(函数(jqXHR、textStatus、errorshown){
警报(jqXHR.responseText | | textStatus);
});
}
将POST请求视为一般HTTP请求,并手动解析正文:
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
var jsonString = await request.Content.ReadAsStringAsync();
// deserialize the string, or do other stuff
return new HttpResponseMessage(HttpStatusCode.OK);
}
注意:通过这种方式,您不需要修改客户端代码,因为您仍然在发布json数据,而不是通用字符串,如果您希望客户端发布序列化的json对象,这在语义上是正确的选择
参考资料:
尝试数据:{model:JSON.stringify(Test)}
这给了我一个对飞行前请求未通过访问控制检查的响应:请求的资源上没有“access control Allow Origin”头
错误消息Don t JSON.stringify。在控制器中使用数据:{value:Test}和([FromBody]字符串测试)。应该返回一个字符串。不要使用JOSN contentType。只需发布一个json格式的字符串,然后使用JsonConvert.DeserializeObject将其转换为您期望的对象。@MarcusH尝试了,但仍然得到一个空值。我尝试了您的建议,效果良好。但我想找到一个解释。您提供的链接包含malware@ChristophAdamakis :
public HttpResponseMessage Post([FromBody] JToken model)
{
DoStuff(model);
var myField = model["fieldName"];
return new HttpResponseMessage(HttpStatusCode.OK);
}