当前位置: 首页 > 面试题库 >

如何在Web API控制器的Post方法中接收动态数据

慕高格
2023-03-14
问题内容

jqgrid将JSON数据发布到POST请求缓冲区中

{"headerData": {
    "Tasudok": "134",
    "Kuupaev": "2015-11-23",
    "Dokumnr": "135319"
   },


"rowData": {
  "Toode":"",
  "Kogus":"0.0000",
  "Nimetus":"öäölä<a",
  "_rowsum":"0.00",
  "Id":"1639",
  "Dokumnr":"135319",
  "_oper":"edit",
  "_rowid":"1639"
  }
}

API/Entity/someid?culture=en&layout=1默认路由一样,使用URL将数据发布到ASP.NET MVC4 Web API

headerDatarowData值属性是在运行时定义的,可以有所不同。

例如,在某些调用中,rowData可能包含其他属性,而某些rowData属性可能会丢失。

culturelayout查询字符串参数是可选的。

如何在WebAPI控制器中接收参数?

我试过了

public class EntityController : APIController
{

public class PostParams {
    public string culture { get; set; }
    public int? layout { get; set; }
    }

    public HttpResponseMessage Post(string id, 
      [FromUri]PostParams optionalParams,
      [FromBody]IList<NameValue> headerData,
      [FromBody]IList<NameValue> rowData )
    { ... }


public class NameValue
{
    public string name, value;
}
}

但是headerData和rowData为空。如何获取所有参数?


问题答案:

有了这个功能,您就可以像在API / Entity / someid?culture = en&layout = 1这样的网址上发送您提供的正文一样。

要在控制器路由中指定可选的查询参数,请为它们提供一个默认值,例如

public class EntityController : APIController
{
    public HttpResponseMessage Post([FromUri]string culture="EN", [FromUri]int layout=1, YourBody body )
    { ... }
}

如果YourBody始终像您提到的那样,则应自动反序列化以下内容:

public class YourBody
{
    public Dictionary<string, string> HeaderData {get; set;}
    public Dictionary<string, string> RowData{get; set;}
}

并且可以让您完全接触到身体的任何元素。

JSON的结构是否可以更改

这样的事情将允许接收任何一种json:

public HttpResponseMessage  Post([FromBody]JToken body)
{
    // Process the body
    return ...
}

您将需要一些额外的验证,因为不会进行对象反序列化。您会知道的唯一想法是您的身体是JSON。

因此,您可能需要对其进行分析,以查看其外观是否符合您的期望。

例如,您可以执行以下操作来处理不断变化的正文内容,并仍然处理路线的可选查询参数:

public HttpResponseMessagePost([FromBody]JToken body, [FromUri]string culture="EN", [FromUri]int layout=1)
{
    JObject headerData= body["headerData"].Value<JObject>();
    JObject headerData= body["rowData"].Value<JObject>();
    return ...;
}

您还可以阅读此有关的原始数据发布到的WebAPI控制器的其他替代品。



 类似资料:
  • 为什么我不能更改方法的名称或在现有的控制器中添加一个新方法?或者我应该说,我如何才能添加一个方法,并让它大摇大摆地展示出来?

  • 问题内容: 我正在尝试使用CodeIgniter开发我的项目的前端客户端。 但是带有CI的ajax使我感到困惑。 这是我的ajax: 和控制器: 现在,我可以通过数组索引获取帐户和密码,但是如何将接收到的数据转换为Object,这样我就可以获得属性: 谢谢! 问题答案: 更改您的ajax: 更改您的控制器: 希望这项工作对您有帮助…

  • 我以以下形式向服务器发送请求: 请求已正确解析为以下方法: 但是,我通过请求内容传递附加数据。如何检索这些数据? 为了举例,让我们假设,请求是从表单发送的:

  • 我试图在@RequestBody中接收一个我不知道的JSON对象,即JSON对象可以是任何长度和数据。 假设JSON可以如下所示

  • 我需要实现一个RESTendpoint,它接收我使用的多部分/表单数据: Spring防尘套 科特林 SpringMVC 提交包含以下部分的多部分表单: 部署名称------文本/普通 启用重复筛选------文本/普通 仅更改部署------文本/普通 部署源------文本/普通 租户id------文本/普通 *----应用程序/八位字节流 Rest控制器看起来是这样的: 对于所有有效的参数

  • 问题内容: 我仍然是Angularjs的新手。我想在控制器中动态注入服务(我创建的)的依赖项。 但是,当我对具有依赖项的服务进行编码时,出现此错误: 错误:未知提供程序:$ windowProvider <-$ window <-base64 这是控制器的代码。 此代码有效: 此代码不起作用: 另一个问题是服务与控制器位于同一模块中。如果模块具有依赖项,则无法使用(我的模块配置中具有$ route