Uso de resultados paginados en AWS SDK para Rust - AWS SDK para Rust

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de resultados paginados en AWS SDK para Rust

Muchas operaciones de AWS devuelven resultados truncados cuando la carga útil es demasiado grande para que se devuelva en una sola respuesta. En su lugar, el servicio devuelve una parte de los datos y un token para recuperar el siguiente conjunto de elementos. Este patrón se conoce como paginación.

AWS SDK para Rust incluye métodos de extensión into_paginator en los generadores de operaciones que se pueden utilizar para paginar automáticamente los resultados. Solo tiene que escribir el código que procesa los resultados. Todos los generadores de operaciones de paginación tienen un método into_paginator() disponible que expone un PaginationStream<Item> para paginar los resultados.

En los siguientes ejemplos, se utiliza Amazon Simple Storage Service. Sin embargo, los conceptos son los mismos para cualquier servicio que tenga una o más API paginadas.

El siguiente ejemplo de código muestra el ejemplo más simple que utiliza el método try_collect() para recopilar todos los resultados paginados en un Vec:

let config = aws_config::defaults(BehaviorVersion::latest()) .load() .await; let s3 = aws_sdk_s3::Client::new(&config); let all_objects = s3.list_objects_v2() .bucket("my-bucket") .into_paginator() .send() .try_collect() .await? .into_iter() .flat_map(|o| o.contents.unwrap_or_default()) .collect::<Vec<_>>();

A veces, es mejor tener un mayor control de la paginación y no guardar todo en la memoria de una sola vez. El siguiente ejemplo itera los objetos en un bucket de Amazon S3 hasta que no haya más.

let config = aws_config::defaults(BehaviorVersion::latest()) .load() .await; let s3 = aws_sdk_s3::Client::new(&config); let mut paginator = s3.list_objects_v2() .bucket("my-bucket") .into_paginator() // customize the page size (max results per/response) .page_size(10) .send(); println!("Objects in bucket:"); while let Some(result) = paginator.next().await { let resp = result?; for obj in resp.contents() { println!("\t{:?}", obj); } }