• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

197
Views
Versionado de API sin código duplicado en C#

Tengo una situación en la que agrego el control de versiones a una API, por lo que cambian las rutas a algunas funciones de la API. También cambié algunos métodos de POST a GET porque tenía más sentido.

Me gustaría desaprobar las rutas antiguas para que la gente empiece a usar las nuevas. Quiero que las rutas antiguas estén vinculadas a la v1 de mi API y las nuevas a la v2. Conseguí que esto funcionara duplicando todas las funciones y etiquetándolas con la ruta, el método y la versión de API correctos, pero esperaba una solución más limpia.

Mi ejemplo de 'limpiador' a continuación obviamente no funciona, ya que obtienes 4 funciones en este caso, todas obsoletas.

Usted obtiene:

  1. HTTPGET /canales
  2. HTTPPOST /canales
  3. HTTPGET /api/v2/canales/get
  4. HTTPPOST /api/v2/canales/get
 /// <summary> /// Gets a list of all channels /// </summary> /// <returns>List of all channels</returns> [HttpPost, Route("~/channels"), ApiVersion("1.0"), Obsolete("Obsolete, please use /api/v2/channels/get")] [HttpGet, Route("Get"), ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannels() { return await _context.Monitors.ToListAsync(); }

¿Hay alguna manera de que pueda hacer que esto funcione?

almost 3 years ago · Santiago Trujillo
2 answers
Answer question

0

Podría hacer dos funciones separadas que actúen como "puntos de acceso" a la lógica interna de la API. Uno de ellos podría marcarse como Obsoleto y usar las rutas antiguas y el otro usaría las rutas nuevas. Luego, podría crear una tercera función que contenga la lógica real de su API.

 // The obsolete access point [HttpPost, Obsolete("Obsolete, please use /api/v2/channels/get"), ApiVersion("1.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsOld() { return await GetChannelsLogic(); } // The new access point [HttpGet, ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsNew() { return await GetChannelsLogic(); } //Marked as NonAction so the method can't be accessed by a request. This is not necessary depending on the setup of your project. [NonAction] public async Task<ActionResult<IEnumerable<DbChannel>>> GetChannelsLogic() { // Perform some other logic return await _context.Monitors.ToListAsync(); }
almost 3 years ago · Santiago Trujillo Report

0

Tratar de usar

 [HttpPost("~/channels"), ApiVersion("1.0"), Obsolete("Obsolete, please use /api/v2/channels/get")] [HttpGet("Get"), ApiVersion("2.0")] public async Task<ActionResult<IEnumerable<string>>> GetChannels() { return new List<string>(); }

para que solo puedas tener dos rutas

  1. HTTPPOST /canales
  2. HTTPGET /api/v2/canales/get
almost 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error