询问一个关于js ajax post json数据,php接收数据的方法
先说一下,我是直接用js,没有用其他库,所以麻烦大家不要用其他库来做为例子
问题是这样,我用js脚本写了一个ajax方法如下
var pagenow=this.classname.substr(4);
var did=document.getelementbyid(did).value;
var url=ooxx;
var jsondata={
hdtype:3,
did:did,
content:content
};
var data={data:jsondata};
var contenttype=application/json;
var ajax=new simple.ajax(post, url, receive4, data,contenttype); //receiveinfo是一个方法名
ajax.sendrequest();
里面simple.ajax是封装好了的,方法中receive4是ajax回调方法,contenttype是数据头,data就是我要发送的数据.大概能看得懂吧..
我举个例子,之前我用post发送简单数据的时候,data的格式就是key1=value1&key2=value2这样,然后服务端用php的获取方法就是$_post[key1],或者$_post[key2]这样子
现在考虑到value1或者value2的值本身就可能包含&这个符号,所以想用json一次把整个对象post到服务器,但是现在有个问题,不知道怎么用php去获取这个数据,我用$_post[data]获取到的是空的,直接print_r($_post)也没有得到数据,请问如何通过php获取数据?
------解决方案--------------------
由于你没告诉我们你的 simple.ajax 是如何写的,那么也只能从原理上说一下
1、如果使用 post 方式发送,那么必须有 content-type = application/x-www-form-urlencoded 的声明
否则 php 不会将出传入的数据解析到 $_post 数组
你发了一个 contenttype = application/json 的声明,即便你的 simple.ajax 会自动补上一个 content-type = application/x-www-form-urlencoded 的声明。这两个相佐的声明也会使 php 无所适从
2、你发送的数据是 {data:jsondata},这是一个 js 对象。即使能够发送成功,php 也会因为不认识这个对象,而无法解析。凡是与外界进行交换的数据结构,都需要按双方约定的格式序列化成字符串
假定你的 simple.ajax 可以将 js 的对象转换成 json 格式串
并且你也去掉了 contenttype = application/json 的声明
那么你在 $_post 中可以看到以那个 json串为键的元素
如果你坚持不愿意去掉 contenttype = application/json 的声明
或许你个用 file_get_contents('php://input') 取到传入的内容
------解决方案--------------------
如果有 content-type=application/json 声明,$_post 是不会有数据的
------解决方案--------------------
file_get_contents('php://input')
但不保证能成功
application/json 只是服务器给使用者用的,告诉用户:你可把内容解释成一个 json 对象
就好比 image/png 是说这是一个 png 图片一样
而用户向服务器发送数据时,只有
application/x-www-form-urlencoded
multipart/form-data
text/plain
三种声明