Подтвердить что ты не робот

Как публиковать произвольный 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 хочет сопоставить что-то, отличное от строки...

4b9b3361

Ответ 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".