我们有一个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:客户端希望服务器发回已有的数据。
哪种方法更好?我们应该选择哪一个?
答案 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);