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

时间:2018-10-15 09:57:54

标签: javascript post fetch

就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),我调试了请求,并且没有任何正文内容发送到服务器...

最后,在两个朋友的帮助下,我们意识到发送正文不是使用其他标头和其他正文格式。这些是我有效的测试文件:

<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”属性使用字符串。

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

2 个答案:

答案 0 :(得分:0)

JSON主体不是$ _POST那样的PHP afaik中的常规数据。您应该可以使用此代码段来读取json。

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

答案 1 :(得分:0)

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