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



我们有一个 API,可以根据其制造商、制造年份、购买城市对电子产品进行估价。

在响应中,我们得到两个价格,坏价格(如果产品几乎没有损坏)和好价格(如果产品几乎是新的)。我们在新屏幕中显示这两个价格以及原始电子产品的详细信息,例如:

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

和坏价格和好价格。

我们有这个输入表单,用户在其中填写详细信息,单击"获取估值按钮"。然后我们点击了我们的估值API,这给了我们结果。

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

1. Keep only bad price and good price in response AND extract Original item manufacturer, year of manufacturing, city of purchase from input query string to API from client.

这种方法的优点:简单整洁。看起来很明显。

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

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

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

缺点:客户端希望服务器发回它已经拥有的数据。

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

理想情况下,我会在响应中添加一些自定义标头,其中包含客户端计算所需的数据。例如,在我支持分页的 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);

最新更新