【问题标题】:Proper way to send json object to HttpGet endpoint in WebAPI 2在 WebAPI 2 中将 json 对象发送到 HttpGet 端点的正确方法
【发布时间】:2015-02-04 13:53:00
【问题描述】:

我正在开发 web api 作为一个门面,它将封装对底层系统的请求。

所以,假设我有 cars 端点:

api/v1/cars

现在我希望我的 api 获取参数,这些参数将确定对底层系统的调用。

喜欢:

{
   provider: 'service_1'.
   access_token: 'token_2',
   info: 'some_info'
},
{
   provider: 'service_2'.
   access_token: 'token_2',
   info: 'some_info'
}

此外,api 将采用标准参数,如startdateenddateoffset 等。

public async Task<Result<Cars>> Get([FromUri] RequestParams requestParams);

public class RequestParams
{
    public RequestParams()
    {
        Limit = 50;
        Offset = 0;
        StartDate = DateTime.Now;
        EndDate = DateTime.Now;
    }

    public string UserId { get; set; }
    public int Limit { get; set; }
    public int Offset { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

从 uri 映射标准参数很容易,但我知道如何正确传递 json 集合。有任何想法吗?

【问题讨论】:

    标签: asp.net json asp.net-web-api2


    【解决方案1】:

    根据定义,GET 请求没有负载(即正文中的数据)。因此,将数据传递给 GET 请求的唯一方法是在 url 中,即使用路由数据或查询字符串参数。

    如果你需要传递一个 JSON 对象,你需要使用不同的请求方法,通常是 POST。这包括传递集合。

    如果您使用 POST,Web API 将自动加载带有 JSON 发布对象的参数对象。如果参数是一个集合(例如 List&lt;T&gt;),它也会被正确填充。

    只有一件事您必须考虑:该方法只能从主体加载一个参数。 IE。您无法从正文中接收 Web API 操作中的多个参数。 (但是,您可以拥有来自 URL 的数据和来自正文的数据)。

    因此,您需要更改您的请求和方法以使用 POST 或任何其他带有有效负载的方法。此外,您必须选择以下两个选项之一:

    1. 创建一个包含所有标准参数的类和集合,并将其用作参数,并将所有数据发布到具有相同结构的单个对象中。

    2. 在查询字符串中传递标准参数,或使用路由数据,并将集合作为 JSON。在这种情况下,您的方法必须有几个参数:onw 用于以 JSON 形式发布的集合,以及一个用于查询字符串或路由数据中发布的其他参数

    不可能按照 kapsi 的回答中提出的那样在查询字符串中发布集合,除非您在客户端对参数进行某种序列化并在服务器端接收参数时进行反序列化。这太过分了,只需使用 POST 或任何其他带有 body 的方法,如上所述。

    【讨论】:

      【解决方案2】:

      如果你例如使用 jQuery,你可以使用 ajax 方法来解决这个问题:

      $.ajax({
          url: "./",
          type: "GET",
          data: {
              UserId: 1,
              Limit: 2,
              Offset: 2,
              StartDate: "02/15/2015",
              EndDate: "05/15/2015"
          }
      });
      

      jQuery 采取行动并执行以下 GET:

      ?UserId=1&Limit=2&Offset=2&StartDate=02%2F15%2F2015&EndDate=05%2F15%2F2015&_=1423137376902
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 2015-11-11
        • 1970-01-01
        • 2020-08-12
        • 2015-10-19
        相关资源
        最近更新 更多