rest: cree una API JSON en PHP que sirva un archivo multiparte/form-data

CorePress2024-01-24  10

Quería crear una API PHP de streaming que envíe archivos JSON (y no una cadena).

Aquí están los dados:

Tenemos una API REST PHP existente, que sirve datos JSON con tipo MIME aplicación/json. Sin embargo, los datos JSON a veces pueden ocupar más de 6 a 10 MB, según la consulta. Otra aplicación solicitará desde los puntos finales de la API REST de PHP, pero debería recibir un archivo JSON para actuar automáticamente como una secuencia de varias partes.

¿Cómo debo construir mis encabezados HTTP, contenido JSON, etc. en PHP para servir el JSON como un archivo y no como una cadena para convertirlo en un servidor de streaming?

¿servir o recibir? ¿Por qué usar multiparte cuando SÓLO son 10 MB?

- Trueno relámpago

27 de marzo de 2021 a las 6:43

AWS API Gateway tiene un límite de recepción y envío de carga útil de 6 a 10 MB. La cadena JSON puede ser mayor.

- Franz Noel

27 de marzo de 2021 a las 6:45

codificar algo como multiparte no cambiará el tamaño de la carga útil.

-Evertir

23/11/2021 a las 21:19



------------------------------------

Creé un servidor ficticio que sirve datos multiparte/formulario y el front-end descarga el archivo como una cadena con file.php como nombre del archivo.

<?php
header('Content-Type: multipart/form-data');
echo file_get_contents('file.json'); // 49 MB file

Después de recopilar los datos multiparte/formulario en el front-end, debe recopilar la cadena JSON como una secuencia y convertirla en un objeto JSON, así:

const jsonData: string[] = []

// Stream and parse the data inside JSON
const stream = streamableResponse.nodeStream()

// Collect all json string
stream.on('data', (chunk) => {
  jsonData.push(chunk)
})

// Handle error of JSON stream
stream.on('error', (error) => {
  logger.error(`An error occured when getting the file contents for ${fileName}`)
  logger.error(error)
})

// Wait for the stream to finish
stream.on('end', async () => {
   const data = JSON.parse(jsonData)
   console.log(data) // Process object data
}

El código anterior recopilará primero la respuesta HTTP como una cadena antes de convertirla en un código JavaScript analizado.

18

1

Sin embargo, esto definitivamente está mal. Multipart es una forma diferente de codificar datos. Si les dice a los clientes que serán datos de formulario de varias partes, pero luego devuelve json, básicamente está mintiendo.

-Evertir

23/11/2021 a las 21:18

Quizás esté bien para su caso de uso y solucione algún problema, peroDefinitivamente no está bien.

-Evertir

23/11/2021 a las 21:18

@Evert Sí... depende del caso de uso. Algunos realizan MÚLTIPLES solicitudes de paginación al recopilar los datos del servidor. En este caso, solo envía UNA solicitud HTTP para descarga.

- Franz Noel

23 de noviembre de 2021 a las 21:21

1

Aun así, lo que estás haciendo no tiene sentido.sentido. Esto no generará nada diferente, excepto que simplemente configure el encabezado de tipo de contenido incorrecto (lo que probablemente dañará a algunos clientes). No hay diferencia si configura el tipo de contenido en aplicación/json.

-Evertir

23 de noviembre de 2021 a las 21:22

1

editar bien, ¡muy extraño! Esto hace que su aplicación técnicamente haga algo no válido, pero si funciona para eludir las restricciones de AWS, ¡supongo que funciona!

-Evertir

23/11/2021 a las 21:30



------------------------------------

Debería haber sabido antes que puedo usar AWS S3 Select para descargar automáticamente lotes de datos, como CSV o JSON, usando secuencias de eventos de BE a FE automáticamente en lugar de usar datos multiparte/formulario de BE a FE y usar Blob. y ReadableStreams para manejar la transmisión entrante desde FE.

https://aws.amazon.com/blogs/developer/introtaining-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare