[翻訳]ASPを作成する.NET WebApi RESTfulサービス(7)
7769 ワード
リソースページングの実装
この章では、いくつかの異なる結果セットのページング方式を紹介し、手動でページングを実現し、その後、Responseを2つの異なる方法でフォーマットします(ResponseのEnvelopメタデータまたはheader).
一度に何百ものデータを返すのは嫌なことだということはよく知られていますが、WebApiでページを分ける必要があります.
手動ページングとパッケージング
次に、CoursesControllerを変更して、すべてのデータを返すのではなく、ページングを実現します.
1: public Object Get(int page = 0, int pageSize = 10)
2: {
3: IQueryable<Course> query;
4:
5: query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);
6: var totalCount = query.Count();
7: var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
8:
9: var urlHelper = new UrlHelper(Request);
10: var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";
11: var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";
12:
13: var results = query
14: .Skip(pageSize * page)
15: .Take(pageSize)
16: .ToList()
17: .Select(s => TheModelFactory.Create(s));
18:
19: return new
20: {
21: TotalCount = totalCount,
22: TotalPages = totalPages,
23: PrevPageLink = prevLink,
24: NextPageLink = nextLink,
25: Results = results
26: };
27:
28: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
コードは簡単で、2つのオプションパラメータを追加し、最終的にQueryStringにフォーマットされます.たとえば、http://localhost:{your_port}/api/courses/?page=1は、最初のページにアクセスする必要がある10のデータを表します.意外なことに、結果はこうかもしれません.
1: {
2:
3: "totalCount": 33,
4: "totalPages": 4,
5: "prevPageLink": "http://localhost:8323/api/courses?page=0&pageSize=10",
6: "nextPageLink": "http://localhost:8323/api/courses?page=2&pageSize=10",
7: "results": [ /* Array containts the results*/ ]
8:
9: }
その結果,jsonにデータをカプセル化してResponseの結果を返すことで,記録総数も返すことができる.1つの明らかな欠点は、このような類似データが我々の所望の結果セットを汚染する可能性があることであり、次にResponse HeaderにX−Paginationパラメータを追加することによってこの機能を実現する.
Response Headerによるページング