web-dev-qa-db-ja.com

任意のJSONオブジェクトをWeb APIに投稿する方法

Jsonオブジェクトをwebapiコントローラー(POST)に渡し、notにマップするクラスを持ち、任意のコンテンツとして処理する方法はありますか?

クライアントから次のように渡した場合:

        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)

しかし、オブジェクトマッパーが文字列以外のものにマッピングしたいようです...

30
Jonathan

モデルバインディングロジックを渡すことでHttpRequestMessageを受け取るpostメソッドを使用し、リクエストのコンテンツを直接読み取ることができます。

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

    }

ところで、JObjectで実行するアクションが機能しない理由は、データの「_id」の値として使用される「ObjectId( "...")」が原因です...

23
Maggie Ying

Jqueryでjsonオブジェクトを渡し、動的オブジェクトで解析しました。正常に動作します。これはサンプルコードです。

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 Multiple Put/Post parameters

19
Bes Ley

入力では、"_id": ObjectId("5069f825cd4c1d590cddf206")がサーバー上のJSONマテリアライゼーションを破壊します。 ObjectIdを削除して"_id" : "5069f825cd4c1d590cddf206"を使用すると、Dictionary<string, object>と同様にJObjectでも機能します

2
user1480400