【问题标题】:how to post arbitrary json object to webapi如何将任意 json 对象发布到 webapi
【发布时间】:2012-11-14 10:24:26
【问题描述】:

我如何/是否可以将 json 对象传递给 webapi 控制器 (POST) 并且 没有 有一个类可以将其映射到,而是将其作为任意内容处理? p>

所以如果我像这样从我的客户那里传递过来:

        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)

但看起来对象映射器想要映射到字符串以外的东西......

【问题讨论】:

    标签: c# json mongodb asp.net-web-api


    【解决方案1】:

    你可以让你的 post 方法接受一个 HttpRequestMessage 来绕过模型绑定逻辑,你可以直接读取请求的内容:

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

    顺便说一句,JObject 中的操作不起作用的原因是因为 'ObjectId("...")' 在您的数据中用作“_id”的值...

    【讨论】:

    • 感谢 - 这个和 kxb 的响应都很有用 - 将答案授予第一响应者
    【解决方案2】:

    我们通过 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

    【讨论】:

      【解决方案3】:

      在您的输入中,"_id": ObjectId("5069f825cd4c1d590cddf206") 是破坏服务器上 JSON 实现的原因。删除ObjectId 并使用"_id" : "5069f825cd4c1d590cddf206"JObject 以及Dictionary<string, object> 一起使用

      【讨论】:

        【解决方案4】:

        很简单,只要把Accept Header放到"application/json"即可。

        【讨论】:

          猜你喜欢
          • 2015-03-08
          • 2020-11-25
          • 1970-01-01
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          • 2019-02-14
          • 2017-05-17
          相关资源
          最近更新 更多