///
/// 指定ページの動物データをMongoDBから取得してJsonで返すWeb API
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using AnimalData;
namespace MyWebService.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class GetAnimalController : ControllerBase
{
private readonly ILogger<GetAnimalController> _logger;
public GetAnimalController(ILogger<GetAnimalController> logger)
{
_logger = logger;
}
// HTTP GETリクエスト処理
// 呼出し元に返される戻り値の形式
// {
// "pagecount" : n,
// [
// {
// "name" : 動物名1,
// "image" : イメージデータ(Base64文字列)
// },
// {
// "name" : 動物名2,
// "image" : イメージデータ(Base64文字列)
// },
// ・・・
// ]
// }
[HttpGet]
public AnimalList Get(
[FromQuery]int page=0, // ページ番号(0ベース。URLに指定。デフォルト0)
[FromQuery]int itemcount=5) { // ページ内の項目数(URLに指定。)
// MongoDB関連初期化
var cli = new MongoClient();
var db = cli.GetDatabase("AnimalDb");
var col = db.GetCollection<AnimalBsonData>("Animals");
var fs = new GridFSBucket(db); // GridFS
// 全レコード数とページ内項目数から全ページ数を求める
int count = col.AsQueryable().Count();
int pagecount = count / itemcount;
if ((count%itemcount) != 0) pagecount++;
// 返すべきレコードまでのスキップ数を計算
int skip = itemcount * page;
// 返す値を設定
var anidata = new AnimalList();
anidata.PageCount = pagecount; // 全ページ数
// 動物データ
List<Animal> lst = new List<Animal>();
foreach(var itm in col.AsQueryable().Skip(skip).Take(itemcount)) {
var ani = new Animal();
ani.Name = itm.Name; // 動物名
ani.Image = fs.DownloadAsBytes(itm.ImageId); // 画像データ
lst.Add(ani);
}
anidata.Animals = lst;
return anidata; // 呼出し元へはJson形式で返される。画像データはBase64化される。
}
}
}