$_POST 未读取 Axios 发布参数

IT技术 javascript php reactjs axios
2021-02-10 00:23:57

所以我有这个代码:

axios({
    method: 'post',
    url,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    data: {
        json,
        type,
    }   
})  

最初我有正常axios.post但我改为这个因为我认为这可能是标题问题。但是我仍然没有检测,我$_REQUEST也没有$_POST但是,它正在接收file_get_contents("php://input").

知道出了什么问题吗?

编辑

好吧,我想我知道出了什么问题。它将它作为一个 json 对象发布,所以它只能在 php://input 中读取。如何在 axios 中将其更改为普通字符串?

6个回答

文档(我没有在引用的材料中保留链接):

使用 application/x-www-form-urlencoded 格式

默认情况下,axios 将 JavaScript 对象序列化为 JSON。

PHP 不支持 JSON 作为填充$_POST.

它仅支持HTML 表单本机支持的机器可处理格式

  • 应用程序/x-www-form-urlencoded
  • 多部分/表单数据

要改为以 application/x-www-form-urlencoded 格式发送数据,您可以使用以下选项之一。

浏览器

在浏览器中,您可以按如下方式使用 URLSearchParams API:

var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params); 

请注意,并非所有浏览器都支持 URLSearchParams,但有一个 polyfill 可用(确保 polyfill 全局环境)。

或者,您可以使用 qs 库对数据进行编码:

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));

或者您可以自定义您的 PHP,以便它可以根据另一个问题的这个答案处理 JSON

如果我再次使用 axios,我会尝试一下,但我只是改用了 jQuery 的 ajax,哈哈
2021-03-25 00:23:57
var params = {
    data1: 'string',
}

axios.post(url, params).then(function(response) {
    //code here 
});

或者

axios.post(url, {data1: 'string' }).then(function(response) {
    //code here 
});

接口

$_POST = json_decode(file_get_contents("php://input"),true);
echo $_POST['data1'];
2021 年 5 月,仍然是一个简单有效的解决方案!
2021-04-13 00:23:57

如果您决定在AJAX库或服务器语言之间切换,则使事情变得更容易和通用随着axios使用原生JS FormData
如果你有一个对象中的数据,你可以将它转换成FormData这样:

var myDataObj = {id:1, name:"blah blah"}
var formData = new FormData();


for (var key in myDataObj) {
    formData.append(key, myDataObj[key])
}

然后你发送数据:

axios.post('/sub/process.php', formData, {
    params: { action: "update-user" },
    headers: { 'Content-Type': 'multipart/form-data' },
    baseURL: 'http://localhost',
}).then(data =>
    console.log(data)
).catch(err => {
    console.log(err)
    return null
})

请注意,您还可以使用paramsin发送一些信息axios,您可以使用$_GET. 另请注意,我使用 baseURL 以防万一您的网页和 API 端点有不同的服务器。
您还需要了解,在axios发送真正的请求之前,它会执行一个preflight请求。预检请求是浏览器在 CORS 中检查资源目的地是否愿意接受真实请求的机制。毕竟,当目标主机无论如何都不愿意接收它时,为什么要发送请求?

您必须确保您的服务器具有适用于您的 axios 请求的正确标头,否则预检请求将检测到不兼容并停止您的请求:

//this is if you are using different different origins/servers in your localhost, * to be update with the right address when it comes to production
header('Access-Control-Allow-Origin: *');
//this is if you are specifying content-type in your axios request
header("Access-Control-Allow-Headers: Content-Type");

现在,您将能够访问$_POST变量中发送的数据

echo "<pre>";
print_r($_POST);
echo "</pre>";

此外,axios 允许您以不同格式发送数据。你可以像这样发送一个json:

axios.post('/sub/process.php', { id: "1", name:"blablah" }, {
    params: { action: "update-item" },
    headers: { 'Content-Type': 'application/json' },
    baseURL: 'http://localhost',
}).then(data =>
    console.log(data)
).catch(err => {
    console.log(err)
    return null
})

在PHP端,可以这样访问:

$data = json_decode(file_get_contents("php://input"),true);
echo "<pre>";
print_r($data);
echo "</pre>";

使用 PHP 标准对象

使用 PHP std 对象结构来获取 post 的变量。

在客户端:

axios.post(url, {id: 1 , Name:'My Name' }).then(function(response) {
    console.log(response.data);
});

在服务器上

$obj = json_decode(file_get_contents('php://input'));   
$id = $obj->id;
$Name = $obj->Name;    

//test by returning the same values
$retObj=(object)["id"=>$id,"Name"=>$Name]
echo json_encode($retObj);

jQuery 和 Axios 使用相同的 PHP 文件

如果您有一个从 axios 和 jquery 接收帖子的文件,您可以使用:

if($_SERVER['REQUEST_METHOD']==='POST' && empty($_POST)) {
   $_POST = json_decode(file_get_contents('php://input'),true); 
}

将 Axios json 序列化的帖子转换为 $_POST 数组

此代码今天适用于浏览器/节点我觉得这个更实用。我在 node.js 上测试了这段代码,并使用$_POST['param1']将数据变量传递给 PHP8 ,它运行良好。

function axqs(d){
    let p = new URLSearchParams();
    Object.keys(d).forEach(function(key){
        p.append(key, this[key]);
    }, d);
    return p
}

let data = {
  'param1': 'value1',
  'param2': 'value2',
}

let p = axqs(data)
axios.post('/foo', p)