在Web API 2中将json对象发送到HttpGet端点的正确方法

时间:2015-02-04 13:53:01

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

我正在开发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集合。有任何想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

如果使用POST,Web API将自动使用JSON发布的对象加载参数对象。如果参数是一个集合(例如List<T>),它也将被正确填充。

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

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

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

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

  3. 在kapsi的答案中提出的在查询字符串中发布集合是不可能的,除非您在客户端进行某种类型的参数序列化并在服务器端接收它时进行反序列化。这有点过分,只需使用POST或任何其他方法与身体,如上所述。

答案 1 :(得分:0)

例如,如果你使用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