正文未在“获取”POST请求和(我的)解决方案中发送[重复]

Posted

技术标签:

【中文标题】正文未在“获取”POST请求和(我的)解决方案中发送[重复]【英文标题】:Body not sent in "fetch" POST request and (my) solution [duplicate] 【发布时间】:2019-03-19 17:29:38 【问题描述】:

就 MDN 所说,使用获取和发送数据进行 POST 请求的正确方法是:(https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)

var url = 'https://example.com/profile';
var data = username: 'example';

fetch(url, 
  method: 'POST', // or 'PUT'
  body: JSON.stringify(data), // data can be `string` or object!
  headers:
    'Content-Type': 'application/json'
  
).then(res => res.json())
.then(response => console.log('Success:', JSON.stringify(response)))
.catch(error => console.error('Error:', error));

但我花了 2 天时间试图让它工作(Chrome、Firefox、Edge)但我做不到......问题是正文没有发送到服务器(GET 请求正常),不是服务器问题,(我在同一台机器上使用 php 7),我调试了请求,根本没有正文内容发送到服务器...

最后,在两个朋友的帮助下,我们意识到,比起使用其他 header 和其他 body 格式,body 是被发送的。这些是我工作的测试文件:

<body>
<button onclick='buttonOneClick()'>One (GET)</button>
<button onclick='buttonTwoClick()'>Two (POST)</button>
<script>
function buttonOneClick()
    fetch('server.php?text=one&id=1')
        .then(r => r.text())
        .then(res => alert('you sent '+res));
 
function buttonTwoClick()

    let data = "text=two&id=1";
    fetch('server.php', 
        method: 'POST',
        body: data,
        headers: 
            'Content-Type':'application/x-www-form-urlencoded',
        ,
    )
    .then(r => r.text())
    .then(res => alert('you sent '+res));

</script>
</body>

和服务器文件,在 PHP 中:

<?php
$param = $_REQUEST['text'] ?? "nothing";
print $param;

我必须使用“application/x-www-form-urlencoded”而不是“application/json”内容类型标头,并为“body”属性使用字符串。

这是 ONLY 在 fetch POST 请求中发送“body”的方式... 是的,当我使用“application/json”标头和 JSON.stringify 作为正文时,我尝试使用很多属性,例如“mode”、“cache”、“credentials”......和“POST”和/或小写的“Content-Type”......以及json数据中的简单双引号......但没有任何效果

【问题讨论】:

看看你的开发者工具网络标签中的请求,它绝对有效......数百万人使用它。问题一定出在您的服务器上。 【参考方案1】:

JSON 正文不是 $_POST 像 PHP afaik 中的常用数据。不过,您应该可以使用这个 sn-p 来读取 json。

// Get JSON as a string
$json_str = file_get_contents('php://input');
// Get as an object
$json_obj = json_decode($json_str);

【讨论】:

谢谢,它有效,但我的第一反应是:WTF???真的???我找不到任何理由将我的 ajax 调用迁移到“fetch”,因为我必须使用这种“肮脏”的技巧,而且我也必须更改 PHP 脚本......我已经用这个修补了我的 php 脚本:$json_str =file_get_contents('php://input'); $json_obj=json_decode($json_str,true); $_REQUEST=array_merge($_REQUEST,$json_obj??array());所以我可以像往常一样使用脚本(即使使用 GET 或 POST),但我认为这样做完全没有意义,只是使用“fetch”,具有 XMLHttpRequest 对象,它更易于使用并且我得到相同的结果【参考方案2】:

这是因为 API 正在接受带有 application/x-www-form-urlencoded 的数据并验证其是否以该格式发送。所以标题应该在application/x-www-form-urlencoded。如果您正在编写 API,请更改 API 以使其仅接受 application/json,然后它将为您提供所需的结果。

【讨论】:

以上是关于正文未在“获取”POST请求和(我的)解决方案中发送[重复]的主要内容,如果未能解决你的问题,请参考以下文章

获取 POST 请求的正文 [Java]

图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3

CORS:无法获取POST请求正文。

如何使用 C# 在 POST 请求中发送 json 请求正文数据

如何在 php 中获取 POST 的正文?

如何在 php 中获取 POST 的正文?