Как публиковать произвольный json-объект для webapi
Как мне/можно передать объект json в контроллер webapi (POST) и не иметь класс для его сопоставления, а скорее обрабатывать его как произвольный контент?
Итак, если я перейду от своего клиента так:
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);
}
});
}
и данные - это что-то вроде:
{ "_id" : ObjectId("5069f825cd4c1d590cddf206"), "firstName" : "John", "lastName" : "Smith", "city" : "Vancouver", "country" : "Canada" }
Мой контроллер сможет его разобрать? И в следующий раз данные могут не соответствовать этой сигнатуре (например:
{ "_id" : ObjectId("5069f825cd4c1d56677xz6"), "company" : "Acme" }
В моем контроллере я попытался:
public HttpResponseMessage Post([FromBody]JObject value)
и
public HttpResponseMessage Post([FromBody]string value)
и (потому что это фактически работает с mongo db):
public HttpResponseMessage Post([FromBody]BsonDocument value)
но похоже, что объект mapper хочет сопоставить что-то, отличное от строки...
Ответы
Ответ 1
У вас может быть ваш метод post, который принимает HttpRequestMessage, передавая логику привязки модели, и вы можете напрямую прочитать содержимое запроса:
public HttpResponseMessage Post(HttpRequestMessage req)
{
var data = req.Content.ReadAsStringAsync().Result; // using .Result here for simplicity...
...
}
Кстати, причина, по которой действие, которое выполняется в JObject, не работает, связано с "ObjectId ("... ")", которое используется как значение "_id" в ваших данных...
Ответ 2
Мы передали json-объект jquery и проанализировали его в динамическом объекте. он отлично работает. это пример кода:
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;
}
аналогичный вопрос о stackoverflow:
Параметры множественного ввода/публикации WebAPI
Ответ 3
В вашем входе "_id": ObjectId("5069f825cd4c1d590cddf206")
- это то, что нарушает материализацию JSON на сервере. Удаление ObjectId
и использование "_id" : "5069f825cd4c1d590cddf206"
работает с JObject
, а также Dictionary<string, object>
Ответ 4
Это очень просто, вам просто нужно поместить заголовок Accept в "application/json".