REST GET请求:可以期待查询字符串参数返回响应,以避免在客户端计算

时间:2017-03-27 03:53:48

标签: rest asp.net-web-api asp.net-web-api2 api-design

我们有一个api,根据制造商,制造年份,购买城市对电子产品进行评估。

在回复中,我们得到两个价格,不好的价格(如果产品损失很小)和良好的价格(如果产品几乎是新的)。我们在新的屏幕中显示这两个价格以及原始电子项目的详细信息,如:

原始商品制造商,制造年份,购买城市。

价格不好,价格也不错。

我们有这个用户填写详细信息的输入表单,点击“获取评估按钮”。然后我们点击了我们的估值API,它将结果返回给我们。

现在,我们有两个评估API响应的选择:

2. Keep bad price, good price,Original item manufacturer, year of manufacturing, city of purchase in response of API.

这种方法的专业:简单而整洁。看起来很明显。

Con:但问题是每个客户端(桌面,移动,Android,ios)需要选择用户输入并在输出屏幕中使用它们。

{{1}}

Pro:无需从api输入中选择信息并将其传递到输出屏幕。第二个屏幕的响应已完成。

Con:客户端希望服务器发回已有的数据。

哪种方法更好?我们应该选择哪一个?

1 个答案:

答案 0 :(得分:1)

理想情况下,我会在响应中添加一些自定义标头,其中包含客户端计算所需的数据。例如,在我支持分页的get请求的情况下,我会在响应中添加一个分页标题,如下所示:

public static class ApiExtensions
{
    #region Fields

    private static string X_PAGINATION_HEADER = "X-Pagination";

    #endregion

    /// <summary>
    /// Adds a header to the current response with the pagination data
    /// </summary>
    /// <param name="headers">Current response header collection</param>
    /// <param name="query">Query executed</param>
    /// <param name="queryResult">Query result</param>
    /// <param name="urlHelper">Url helper to create next/previous links</param>
    /// <param name="routeName">Current executing route</param>
    /// <returns>Current response headers with pagination data</returns>
    public static NameValueCollection AddPaginationHeader(this NameValueCollection headers, IQuery query, IQueryResult queryResult, UrlHelper urlHelper, string routeName)
    {
        dynamic dQuery = query;
        dynamic dResult = queryResult;
        var totalPages = (int)Math.Ceiling((double)dResult.TotalCount / dQuery.PageSize);
        var previousLink = (dQuery.Page > 1) ? urlHelper.Link(routeName, new
        {
            sortParams = dQuery.SortParams,
            page = (dQuery.Page - 1),
            pageSize = dQuery.PageSize,
            userId = dQuery.UserId
        }) : "";


        var nextLink = (dQuery.Page < totalPages) ? urlHelper.Link(routeName, new
        {
            sortParams = dQuery.SortParams,
            page = (dQuery.Page + 1),
            pageSize = dQuery.PageSize,
            userId = dQuery.UserId
        }) : "";

        var paginationHeader = new
        {
            currentPage = dQuery.Page,
            pageSize = dQuery.PageSize,
            totalPages = totalPages,
            nextLink = nextLink,
            previousLink = previousLink
        };

        headers.Add(X_PAGINATION_HEADER, JsonConvert.SerializeObject(paginationHeader));
        return headers;
    }
}

然后在我的控制器中调用此扩展方法,然后返回响应:

HttpContext.Current.Response.Headers.AddPaginationHeader(query, result, new UrlHelper(Request), "datalist");
            return Ok(result);