web-dev-qa-db-fra.com

comment publier un objet json arbitraire dans une API Web

Comment puis-je/est-il possible de passer un objet json à un contrôleur webapi (POST) et pas avoir une classe pour le mapper, mais plutôt le gérer comme un contenu arbitraire?

Donc, si je passe de mon client comme ça:

        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);
            }
        });
    }

et les données sont quelque chose comme:

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

Mon contrôleur pourra l'analyser? Et la prochaine fois, les données peuvent ne pas correspondre à cette signature (par exemple:

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

Dans mon contrôleur, j'ai essayé:

public HttpResponseMessage Post([FromBody]JObject value)

et:

public HttpResponseMessage Post([FromBody]string value)

et (parce que cela fonctionne en fait avec un mongo db):

public HttpResponseMessage Post([FromBody]BsonDocument value)

mais il semble que le mappeur d'objet veuille mapper sur autre chose qu'une chaîne ...

30
Jonathan

Vous pouvez avoir votre méthode de publication qui prend un HttpRequestMessage pour contourner la logique de liaison du modèle et vous pouvez lire le contenu de la demande directement:

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

    }

Soit dit en passant, la raison pour laquelle l'action qui prend dans JObject ne fonctionne pas est à cause de 'ObjectId ("...")' qui est utilisé comme valeur de "_id" dans vos données ...

23
Maggie Ying

Nous avons passé json objet par jquery et l'avons analysé en objet dynamique. ça fonctionne bien. voici un exemple de 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;
}

question similaire sur stackoverflow: WebAPI Multiple Put/Post parameters

19
Bes Ley

Dans votre entrée, "_id": ObjectId("5069f825cd4c1d590cddf206") est ce qui rompt la matérialisation JSON sur le serveur. Suppression de ObjectId et utilisation de "_id" : "5069f825cd4c1d590cddf206" fonctionne avec JObject ainsi que Dictionary<string, object>

2
user1480400