将JSON字符串发布到WEB API

Yoa*_*oav 8 javascript json cors asp.net-web-api2

我有一个ASP.NET WEB-API 2应用程序女巫需要有一个POST接受JOSN string未知结构的方法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)
    };
}
Run Code Online (Sandbox Code Playgroud)

和我的客户端方法:

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);
    });
}
Run Code Online (Sandbox Code Playgroud)

所以,问题是我怎么能发布一个未知JSON stringjavascript,接受它作为我的一个字符串api的方法?

Ale*_*yen 10

我编辑了你的代码,效果很好.

[FromBody]属性指定action参数仅来自传入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);
    });
}
Run Code Online (Sandbox Code Playgroud)


Fed*_*uma 9

将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);
}
Run Code Online (Sandbox Code Playgroud)

或者使用通用的JToken,让序列化器完成剩下的工作:

public HttpResponseMessage Post([FromBody] JToken model)
{
    DoStuff(model);

    var myField = model["fieldName"];

    return new HttpResponseMessage(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)

注意:这样您就不需要更改客户端代码,因为您仍然在发布json数据,而不是通用字符串,如果您希望客户端发布序列化的JSON对象,那么它在语义上是正确的选择.

参考文献:

http://bizcoder.com/posting-raw-json-to-web-api