我不确定如何搜索存储在我的数据库中的“代码”,以便返回"OriginalUrl“。我知道我可以搜索ObjectId,但我希望能够通过分配给该ObjectId的“代码”进行搜索。
目前,我有一个工作程序,它接受一个Url以及“标题”,并将其发送到数据库:
它被分配了一个Objectid代码和一个随机生成的12个字符的“_id”:
如果对有帮助,这是我的类:
namespace ShortenUrls.Controllers
{
[Route("api/codes")]
public class ShortUrlsController : Controller
{
private readonly ShortUrlRepository _repo;
public ShortUrlsController(ShortUrlRepository repo)
{
_repo = repo;
}
[HttpGet("{id}")]
public async Task<IActionResult> Get(string id)
{
var su = await _repo.GetAsync(id);
if (su == null)
return NotFound();
return Ok(su);
}
[HttpPost]
public async Task<IActionResult> Create([FromBody] ShortUrl su)
{
await _repo.CreateAsync(su);
return Ok(su);
}
}
和Repository类:
namespace ShortenUrls.Models.Repository
{
public class ShortUrlRepository
{
private const string alphabet = "23456789bcdfghjkmnpqrstvwxyz-_";
private static readonly Random rand = new Random();
private readonly Database _db;
public ShortUrlRepository(Database db)
{
_db = db;
}
private static string GenerateCode()
{
const int codeLength = 12;
var chars = new char[codeLength];
for (var i = 0; i < codeLength; i++)
{
chars[i] = alphabet[rand.Next(0, alphabet.Length)];
}
return new string(chars);
}
public Task<ShortUrl> GetAsync(string id)
{
var objId = ObjectId.Parse(id);
return _db.Urls.Find(x => x.Id == objId).FirstOrDefaultAsync();
}
public Task CreateAsync(ShortUrl su)
{
su.Code = GenerateCode();
return _db.Urls.InsertOneAsync(su);
}
}
发布于 2018-06-09 05:17:07
只需使用过滤器即可。这样做可以让你创建一个专门针对“代码”的查询。
public async Task<ShortUrl> GetAsync(string code)
{
var filterBuilder = new FilterDefinitionBuilder<ShortUrl>();
var filter = filterBuilder.Eq(s => s.Code, code);
var cursor = await _db.Urls.FindAsync(filter);
return await cursor.FirstOrDefaultAsync();
}
发布于 2018-06-09 10:15:59
假设您已经知道调用此函数时的代码,并且在InsertOneAsync
调用时创建了ObjectId。首先,更改您的存储库,将Code
作为可搜索的输入。
public Task<ShortUrl> GetAsync(string code)
{
return await _db.Urls.FirstOrDefaultAsync(x => x.Code == code);
}
然后将您的控制器Get
更改为:
[HttpGet("{code}")]
public async Task<IActionResult> Get(string code)
{
var su = await _repo.GetAsync(code);
if (su == null)
return NotFound();
return Ok(su);
}
在您的控制器中,如果您只需要在获取对象后返回su.OriginalUrl
,则可以访问它。
然后在邮递员中,你可以直接调用http://localhost:51767/api/codes?code=cmg3fjjr_gtv
请记住,在Startup.cs
中通过默认路由设置的默认url参数仅适用于Id
。
app.UseMvc(routes => { /*...*/ })
所以这是行不通的:/api/codes/cmg3fjjr_gtv,除非你专门设置了路由或者把{code}
改回了{id}
。不过,代码的可读性会受到影响。
https://stackoverflow.com/questions/50766806
复制相似问题