Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to post arbitrary json object to webapi

How do I / is it possible to pass in a json object to a webapi controller (POST) and not have a class to map it to, but rather handle it as arbitrary content?

So if I pass in from my client like so:

        createRecord: function (model, data, callback, callbackParams) {         var request = jQuery.ajax({             type: "POST", // default = GET,             url: '/api/' + model + '/',             data: data,             contentType: 'application/json',             success: function (msg) {                 $('#results').text(msg);                 if (callback) // only fire a callback if it has been specified                     callback(msg, callbackParams);             },             error: function (jqXHR, textStatus) {                 alert('Request failed: ' + textStatus);             }         });     } 

and data is something like:

{ "_id" : ObjectId("5069f825cd4c1d590cddf206"), "firstName" : "John", "lastName" : "Smith", "city" : "Vancouver", "country" : "Canada" } 

My controller will be able to parse it? And next time the data may not match that signature (eg:

{ "_id" : ObjectId("5069f825cd4c1d56677xz6"), "company" : "Acme" } 

In my controller, I have tried:

public HttpResponseMessage Post([FromBody]JObject value) 

and:

public HttpResponseMessage Post([FromBody]string value) 

and (because this is actually to work with a mongo db):

public HttpResponseMessage Post([FromBody]BsonDocument value) 

but it looks like the object mapper wants to map to something other than string...

like image 691
Jonathan Avatar asked Nov 26 '12 21:11

Jonathan


People also ask

How do I post JSON data to API using C#?

To post JSON to a REST API endpoint using C#/. NET, you must send an HTTP POST request to the REST API server and provide JSON data in the body of the C#/. NET POST message. You also need to specify the data type in the body of the POST message using the Content-Type: application/json request header.


2 Answers

You can have your post method that takes in a HttpRequestMessage to by pass the model binding logic and you can read the content of the request directly:

    public HttpResponseMessage Post(HttpRequestMessage req)     {         var data = req.Content.ReadAsStringAsync().Result; // using .Result here for simplicity...         ...      } 

By the way, the reason why the action that takes in JObject doesn't work is because of 'ObjectId("...")' that is used as the value of "_id" in your data...

like image 68
Maggie Ying Avatar answered Sep 29 '22 02:09

Maggie Ying


We passed json object by jquery, and parse it in dynamic object. it works fine. this is sample code:

ajaxPost:  ... Content-Type: application/json, data: {           "name": "Jack",            "age": "12"       } ... 

webapi:

[HttpPost] public string DoJson2(dynamic data) {     string name = data.name;     int age = data.age;      return name; } 

similary question on stackoverflow: WebAPI Multiple Put/Post parameters

like image 38
Bes Ley Avatar answered Sep 29 '22 02:09

Bes Ley