【问题标题】:Create a JSON API in PHP Serving multipart/form-data File在 PHP Serving multipart/form-data 文件中创建 JSON API
【发布时间】:2021-06-23 23:25:22
【问题描述】:

我想创建一个发送 JSON 文件(而不是字符串)的 Streaming PHP API。

以下是给定的:

  • 我们有一个现有的 PHP REST API,它提供 application/json MIME 类型的 JSON 数据。但是,JSON 数据有时会超过 6-10 MB,具体取决于查询。
  • 另一个应用程序将从 PHP REST API 的端点发出请求,但应收到一个 JSON 文件以自动充当多部分流。

我应该如何在 PHP 中构建我的 HTTP 标头、JSON 内容等,以将 JSON 作为文件而不是字符串来提供,从而使其成为流式服务器?

【问题讨论】:

  • 服务还是接受?为什么要使用只有 10MB 的 multipart?
  • AWS API Gateway 有接收和发送 6-10MB 有效负载的限制。 JSON 字符串可以更大。
  • 将某些内容编码为多部分不会改变有效负载大小。

标签: php json rest http blob


【解决方案1】:

我创建了一个为multipart/form-data 提供服务的虚拟服务器,前端将文件下载为字符串,并以file.php 作为文件名。

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

在前端收集multipart/form-data后,它应该将JSON字符串收集为流并将其转换为JSON对象,如下所示:

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
}

上面的代码将首先将 HTTP 响应收集为字符串,然后再将其转换为已解析的 JavaScript 代码。

【讨论】:

  • 这绝对是错误。 Multipart 是一种不同的数据编码方式。如果你告诉客户它将是multipart/form-data,然后返回 json 你基本上是在撒谎。
  • 也许它适合您的用例并且可以解决一些问题,但它绝对不正确。
  • @Evert 是的...这取决于用例。有些人在从服务器收集数据时会执行多个分页请求。在这种情况下,它只发送一个 HTTP 下载请求。
  • 你所做的仍然没有意义。这不会产生任何不同的东西,除了您只是设置了错误的内容类型标头(这可能会破坏某些客户端)。如果将 content-type 设置为application/json,则没有区别。
  • edit 好的,很奇怪!这确实使您的应用程序在技术上做一些无效的事情,但如果它可以规避 AWS 限制,我猜它可以工作!
猜你喜欢
  • 1970-01-01
  • 2015-09-19
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多