Working with ASP.NET Web API, the most unexpected thing is the limited support of POST data values to simple ApiController methods.
When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. At most one parameter is allowed to read from the message body. The reason for this rule is that the request body might be stored in a non-buffered stream that can only be read once.
A simple principle, you can send any content in HTTP request, it only need to be serializable into a string. So, it could be multiple JSON object. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object).
Here I found a workaround to pass multiple complex objects (using the above principle) from jquery to a WEB API using JObject, and then cast back to your required specific object type in api controller. This objects provides a concrete type specifically designed for working with JSON.
and then you can get this object in your ApiController
I have made a generic function to unwrap the complex object, so there is no limitation of number of objects while sending and unwrapping. We can even send more than two objects
I hope it would help someone. I would be interested to hear from the experts here regarding the pros and cons of using this methodology. Do share your feedback.
Happy Coding!
When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. At most one parameter is allowed to read from the message body. The reason for this rule is that the request body might be stored in a non-buffered stream that can only be read once.
A simple principle, you can send any content in HTTP request, it only need to be serializable into a string. So, it could be multiple JSON object. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object).
Here I found a workaround to pass multiple complex objects (using the above principle) from jquery to a WEB API using JObject, and then cast back to your required specific object type in api controller. This objects provides a concrete type specifically designed for working with JSON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var customer = { "Name" : "jhon" , "Id" : 1, }; var product = { "Name" : "table" , "CategoryId" : 5, "Count" : 100 }; var employee = { "Name" : "Fatih" , "Id" : 4, }; var combinedObj = {}; combinedObj[ "obj1" ] = customer; combinedObj[ "obj2" ] = product; combinedObj[ "obj3" ] = employee; $.ajax({ type: 'POST' , async: true , url: 'api/PostGenericObjects/' , data: JSON.stringify(combinedObj), success: function (response) { console.log( "Response Data ↓" ); console.log(response); }, error: function (err) { console.log(err); } }); |
and then you can get this object in your ApiController
1 2 3 4 5 6 7 8 9 10 11 12 | using Newtonsoft.Json.Linq; public string PostGenericObjects( object obj) { string [] str = GeneralMethods.UnWrapObjects(obj); var customer = JsonConvert.DeserializeObject<Customer>(str[0]); var product = JsonConvert.DeserializeObject<Product>(str[1]); var employee = JsonConvert.DeserializeObject<Employee>(str[2]); //... other work.... } |
I have made a generic function to unwrap the complex object, so there is no limitation of number of objects while sending and unwrapping. We can even send more than two objects
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class GeneralMethods { public static string [] UnWrapObjects( object obj) { JObject o = JObject.Parse(obj.ToString()); string [] str = new string [o.Count]; for ( int i = 0; i < o.Count; i++) { string var = "obj" + (i + 1).ToString(); str[i] = o[var].ToString(); } return str; } } |
I hope it would help someone. I would be interested to hear from the experts here regarding the pros and cons of using this methodology. Do share your feedback.
Happy Coding!
Comments
Post a Comment