Asp.Net-Core + MongoDb - Как найти базу данных по «коду» и вернуть исходный URL? - PullRequest
0 голосов
/ 08 июня 2018

Я не уверен, как искать «Код», хранящийся в моей базе данных, чтобы вернуть «OriginalUrl».Я знаю, что могу искать ObjectId, но я хочу иметь возможность искать по «коду», назначенному этому ObjectId.

В настоящее время у меня есть рабочая программа, которая принимает URL-адрес, а также «заголовок» иотправляет его в базу данных: enter image description here

Ему присваивается _объект и произвольно сгенерированный 12-значный код: enter image description here

Если это поможет это мой класс контроллера:

    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);
            }
}

и класс репозитория:

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);
    }
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Предполагая, что вы уже знаете код при вызове этого и этот ObjectId создается при вызове InsertOneAsync.Сначала измените свой репозиторий, чтобы принять 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

Помните только Id работает для параметров URL по умолчанию в качестве настройки по умолчанию ваши маршрутыв Startup.cs.

app.UseMvc(routes => { /*...*/ })

Так что это не сработает: / api / codes / cmg3fjjr_gtv , если вы специально не настроили маршрутизацию или не изменили {code} обратно на {id}.Хотя читаемость вашего кода страдает.

0 голосов
/ 09 июня 2018

Просто используйте фильтр.Делая это таким образом, мы создадим запрос специально для «кода».

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();
}
...