php 无法使用Fetch进行开机自检

wfveoks0  于 2023-09-29  发布在  PHP
关注(0)|答案(3)|浏览(121)

我在使用Fetch将数据发布到API时遇到问题。我将其简化为:
我在https://sophivorus.com/post.php上创建了一个简单的PHP文件,代码如下:

<?php
echo json_encode( $_POST );

如果我浏览到它,打开开发控制台,并运行以下简单命令:

fetch( 'https://sophivorus.com/post.php', {
    method: 'POST',
} ).then( response => response.json() ).then( console.log );

我得到一个有效的空JSON响应。但是,如果我添加一个payload:

fetch( 'https://sophivorus.com/post.php', {
    method: 'POST',
    body: JSON.stringify( {
        foo: 'bar'
    } ),
} ).then( response => response.json() ).then( console.log );

我希望得到一个JSON响应与张贴的值。但我得到的是同样空洞的回答。由于某种原因,我的POST数据没有被发布。
我肯定这一定是很愚蠢的事情,但我就是看不出来。任何帮助将是最受欢迎的,谢谢!!

vaj7vani

vaj7vani1#

使用FormData而不是JSON.stringify可以工作。我不是很精通PHP,但我的理论是PHP不会自动解析JSON数据(当使用JSON.stringify时)。在回显json_encode之前,需要先使用json_decode。另一方面,FormData会自动解析为$_POST数组。

let fd = new FormData()
fd.append("foo", "bar")

fetch( 'https://sophivorus.com/post.php', {
    method: 'POST',
    body: fd,
} ).then( response => response.json() ).then( console.log );
qco9c6ql

qco9c6ql2#

尝试在fetch header选项中添加'Content-Type': 'application/json'。它帮助服务器解释您发送的数据。

fetch( 'https://sophivorus.com/post.php', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify( {
        foo: 'bar'
    } ),
} ).then( response => response.json() ).then( console.log );

参考号:Is Content-Type mandatory in HTTP post request?

vwhgwdsa

vwhgwdsa3#

问题与提取无关。一个简单的客户端请求显示了同样的问题:

> POST /post.php HTTP/2
> Host: sophivorus.com
> user-agent: insomnia/2023.3.0
> content-type: application/json
> accept: */*
> content-length: 21

* TLSv1.2 (OUT), TLS header, Supplemental data (23):

| {
|     "foo": "bar"
| }

* We are completely uploaded and fine
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):

< HTTP/2 200 
< date: Sun, 24 Sep 2023 06:45:02 GMT
< server: Apache
< cache-control: max-age=600
< expires: Sun, 24 Sep 2023 06:55:02 GMT
< vary: User-Agent
< content-length: 2
< content-type: text/html; charset=UTF-8

回复:[]
$_POST数组用于请求体的urlencoded参数,而不是json。
试试看:

<?php
// Get the JSON contents
$json = file_get_contents('php://input');

// Return json data
echo $json;

To apply the json to an associative array:

$entityData = json_decode($json, true);

Now you can access foo as follows:

$entityData['foo']

相关问题