在 PHP Serving multipart/form-data 文件中创建 JSON API
Posted
技术标签:
【中文标题】在 PHP Serving multipart/form-data 文件中创建 JSON API【英文标题】:Create a JSON API in PHP Serving multipart/form-data File 【发布时间】: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 字符串可以更大。 将某些内容编码为多部分不会改变有效负载大小。 【参考方案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 限制,我猜它可以工作!以上是关于在 PHP Serving multipart/form-data 文件中创建 JSON API的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow serving 中 No module named tensorflow_serving.apis,找不到predict_pb2问题