php刚使用没几天,也不是我主要的涉及,以前用的处理都忘得差不多了,但是解决了跨域后,使用jquery的ajax发现诸多问题,使用网页和第三方post测试插件无法获取一致的响应?个人解决办法,虽然比较low, 但是简单用下是可以的,当然有比较好的做法,我洗耳恭听
在不发生跨域问题的情况下,使用$.ajax一般是能获取到响应的
$.ajax({
url:'index.php',
data:{"data":{"name":"fred", "info":{"id":1,"cid":1009}}},
type:'POST',
success:function(data){
alert(data);
},
error(xhr){
alert('ERROR\n'+xhr.responseText)
}
index.php
<?php
header("Access-Control-Allow-Origin:*");
header("Content-Type:text/html;charset=utf-8");
echo $_POST['data']
默认情况下,不指定Content-Type的$.ajax是以application/x-www-form-urlencoded形式提交的,而php的$_POST默认也只识别这种。
但是通过第三方POST测试工具(比如PostMan等)发送application/x-www-form-urlencoded、raw-json、form-data都无法获取正确的响应 (格式不对、需要解码等)
也就是说用浏览器的跟工具是无法统一的,这时候只需简单做个判断就可以了
/**
* 本php只做post请求
*/
$data = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : "" ;
if($data){
//如果$data不为空,说明发送的实体在$GLOBALS["HTTP_RAW_POST_DATA"]中(即,有可能是通过raw-json发过来的)
$fd=json_decode($data,true);//解码成array对象
//下面这句话是额外功能,可提交 带"data"键也可不带"data"的数据,最终都值获取data对应的数据
//但是不修改默认contentType的话,通过$.ajax发送时必须要带上"data"
if(isset($fd['data'])){
$fd=$fd['data'];
}
}else{
$fd=$_POST['data'];
if(!is_array($fd)){//如果post发过来的是string也,解码成array对象
$fd=json_decode($fd,true);
}
}
//$fd就是 {"name":"fred", "info":{"id":1,"cid":1009}} 不过是php的array("name"=>"fred",...)
好了,最后说个也是我遇到的问题:
在使用$.ajax,并且提交数据类型dataType设置为json时,如果服务器端正确返回,前台页面获取不到响应?
其实这个时候服务器会把这些返回到$.ajax的回调error(xhr)中,通过xhr.responseText就能获取到信息,这点还不太懂,如有大神知道的,告知一下,tks!
来源:oschina
链接:https://my.oschina.net/u/1388778/blog/509552