zoukankan      html  css  js  c++  java
  • PHP content-type为"application/json"的post过来的数据$_POST接受不到的问题

    ajax默认是以application/x-www-form-urlencoded方式提交。也就是常见的表单提交方式。在PHP中使用$_POST方式可以轻松获取。

    但如果将ajax的请求头强制指定为application/json,那么你的$_POST就接受不到了。必须使用$GLOBALS['HTTP_RAW_POST_DATA']取出来,然后再json_decode就行了。

    如fetch、axios默认的请求头就是application/json,所以要注意一下。


    还有一些的细节需要了解一下

    1、后端必须允许前端定义Content-Type之类的头请求。

    header('Access-Control-Allow-Headers:x-requested-with,content-type'); 

    2、php中exit的输出只允许字符串。所以要输出什么之前最好使用(string)转义一下。

    3、如果使用ajax的application/json方式,记得data参数是字符串类型的。使用JSON.stringify()转换一下。


    jquery ajax的代码:

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
    </head>
    <body>
        <script>
            $(function () {
                $.ajax({
                    type:"post",
                    url:"http://localhost:8080/news.php",
                    data: JSON.stringify({
                        newsid: 101
                    }),
                    headers: {
                        "Content-type": "application/json; charset=utf-8"
                    },  
                    success: function (data) {
                        console.log(data)
                    }
                })
            })
        </script>
    </body>
    </html>
    复制代码

    php代码:

    复制代码
    <?php
    header("Access-Control-Allow-Origin:*"); 
    header('Access-Control-Allow-Headers:x-requested-with,content-type'); 
    
    $rws_post = $GLOBALS['HTTP_RAW_POST_DATA'];
    $mypost = json_decode($rws_post);
    $newsid = (string)$mypost->newsid;
    exit($newsid);
     
  • 相关阅读:
    java 算法最长连续递增子序列
    java 算法最长连续递增序列
    最大连续子数组和(Java)
    mysql时间序列与窗口函数
    CSS控制br高度
    小知识随手记(九):兄弟选择器(~和+)区别
    VUE组件递归实现自定义目录及拖拽效果
    VUE的插件解析
    VUE的mixin混入解析
    VUE高阶组件解析
  • 原文地址:https://www.cnblogs.com/wangluochong/p/9885042.html
Copyright © 2011-2022 走看看