es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener solicitud y respuesta de una API web y guardarla en la base de datos.

Tengo un método en la clase Controller a continuación:

     [HttpGet]
     [ResponseType(typeof(RsContractCustomer))]
     [Route("api/Contract/GetCustomerData/{cardModificationId}")]
     public async Task<IHttpActionResult> GetCustomerData([FromUri] int cardModificationId)
     {
         var jsonIgnoreNullValues = JsonConvert.SerializeObject(await _bs.GetCustomer(cardModificationId), Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
         {
             NullValueHandling = NullValueHandling.Ignore
         });

         JObject jObject = JObject.Parse(jsonIgnoreNullValues);
         return Ok(jObject); //await _bs.GetCustomerData(id));
     }

Ahora quiero obtener HttpResponseMessage y guardar una parte particular en la base de datos. ¿Qué debo agregar en este código o implementar Middleware para hacerlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para guardar una parte particular del HttpResponseMessage en la base de datos, puedes modificar el método GetCustomerData existente de las siguientes formas:

    1. Cambia el tipo de retorno del método de Task<ihttpactionresult> a Task<httpresponsemessage>, ya que deseas devolver un HttpResponseMessage en lugar de un IHttpActionResult.
    2. Crea una nueva instancia de HttpResponseMessage que será devuelta por el método. Puedes usar la propiedad Content para establecer el contenido del mensaje de respuesta, que puede ser una cadena, un objeto JSON o cualquier otro contenido HTTP válido.

    3. Usa la instancia de JObject jObject para extraer la parte particular de la respuesta que deseas guardar en la base de datos.

    4. Guarda los datos extraídos en la base de datos utilizando tu tecnología de acceso a base de datos preferida.

    A continuación se muestra el código modificado:

    [HttpGet]
    [ResponseType(typeof(RsContractCustomer))]
    [Route("api/Contract/GetCustomerData/{cardModificationId}")]
    public async Task<httpresponsemessage> GetCustomerData([FromUri] int cardModificationId)
    {
        var jsonIgnoreNullValues = JsonConvert.SerializeObject(await _bs.GetCustomer(cardModificationId), Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore
        });
    
        JObject jObject = JObject.Parse(jsonIgnoreNullValues);
        string dataToSave = jObject["particularData"].ToString(); // reemplaza "particularData" con la propiedad JSON real que deseas guardar
    
        // guarda los datos extraídos en la base de datos utilizando tu tecnología de acceso a base de datos preferida
    
        // crea el mensaje de respuesta
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StringContent("Datos guardados exitosamente");
    
        return response;
    }
    

    Alternativamente, puedes crear un middleware que intercepta la respuesta antes de que se envíe al cliente, extraer los datos particulares que deseas guardar y luego guardarlos en la base de datos. Para hacer esto, deberías crear una clase que implemente la interfaz IMiddleware y sobrescriba el método InvokeAsync. En el método InvokeAsync, puedes acceder al contenido de la respuesta, extraer la parte particular que deseas guardar y luego guardarla en la base de datos.

    Aquí hay un ejemplo de una clase de middleware que extrae y guarda el contenido de la respuesta:

    public class ResponseMiddleware : IMiddleware
    {
        private readonly IDbContext _dbContext;
    
        public ResponseMiddleware(IDbContext dbContext)
        {
            _dbContext = dbContext;
        }
    
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            var response = context.Response;
    
            var originalBody = response.Body; // almacena el cuerpo de la respuesta original
    
            using(var memoryStream = new MemoryStream())
            {
                response.Body = memoryStream; // reemplaza el flujo de respuesta con un flujo de memoria
    
                await next(context); // invoca el siguiente middleware o acción de controlador
    
                memoryStream.Seek(0, SeekOrigin.Begin); // restablece la posición del flujo de memoria al principio
    
                // obtiene el contenido de respuesta como una cadena
                var responseBody = await new StreamReader(memoryStream).ReadToEndAsync();
    
                // extrae los datos particulares que deseas guardar del cuerpo de respuesta
                var jObject = JObject.Parse(responseBody);
                var dataToSave = jObject["particularData"].ToString(); // reemplaza "particularData" con la propiedad JSON real que deseas guardar
    
                // guarda los datos extraídos en la base de datos utilizando tu tecnología de acceso a base de datos preferida
                _dbContext.Save(dataToSave);
    
                // escribe el cuerpo de respuesta original en el flujo de respuesta
                memoryStream.Seek(0, SeekOrigin.Begin);
                await memoryStream.CopyToAsync(originalBody);
            }
        }
    }
    

    Para usar el middleware, debes registrarlo en la canalización de solicitud de la aplicación en el método Configure de la clase Startup:

    “`
    public void Configure(IApplicationBuilder app)
    {
    // otras registraciones de middleware

    app.UseMiddleware<responsemiddleware>(new DbContext()); // reemplaza DbContext con tu tecnología de acceso a base de datos preferida
    

    }
    “`

Comments are closed.