我已经阅读了很多关于这个主题的帖子,但看起来它们都与我的背景无关。
我有一个 JS 库,它向后端发送包含以下格式数据的 POST 请求:
------WebKitFormBoundaryDjoP6y6CoTH58A26
Content-Disposition: form-data; name="data"
[{ <JSON formatted data> }}]
------WebKitFormBoundaryDjoP6y6CoTH58A26--
我知道,因为我使用过浏览器检查器。我的问题是我无法获取这些数据。传统的
file_get_contents('php://input')
返回一个空字符串。尝试使用 apache_request_headers()
进一步调查,这就是后端收到的内容:
Array
(
[Cookie] => PHPSESSID=e8tlf5aocqmb5eu2qliu7pnkl4; arpadmin=s1pg7pg31kl2e9sj96kg2arqc4; __gsas=ID=6ed6b402c3253656:T=1702304073:RT=1702304073:S=ALNI_Mbb4fbtcgyhQiVS58b1D5bl7hnPmA
[Accept-Language] => en-US,en;q=0.9,it;q=0.8
[Accept-Encoding] => gzip, deflate
[Referer] => http://myhostname.mydomain.org/arp/lat.php?mese=1&anno=2024
[Origin] => http://myhostname.mydomain.org
[Content-Type] => multipart/form-data; boundary=----WebKitFormBoundaryEAp4qyLXkJs3nO4a
[User-Agent] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0
[X-Requested-With] => XMLHttpRequest
[Dnt] => 1
[Cache-Control] => no-cache
[Pragma] => no-cache
[Accept] => application/json
[Content-Length] => 368
[Connection] => keep-alive
[Host] => myhostname.mydomain.org
)
我的数据在哪里?
将 JSON 提交到 API 端点的最直接方法是使用
Content-Type: application/json
,这需要从 php://input
读取原始数据并自行解析。但你的 JavaScript 库没有使用它。它使用 HTML 表单支持的两种经典格式之一,PHP 会自动解码为 $_POST
:
application/x-www-form-urlencoded
multipart/form-data
<-- This is yours您的原始 JSON 将在
$_POST['data']
处提供,并对其应用 json_decode() 应该会获得预期的数据...除非请求是其他内容,例如 PATCH 或 PUT(如果不确定,请检查 $_SERVER['REQUEST_METHOD']
)。