php刚使用没几天,也不是我主要的涉及,之前用的处理都忘得差很少了,可是解决了跨域后,使用jquery的ajax发现诸多问题,使用网页和第三方post测试插件没法获取一致的响应?我的解决办法,虽然比较low, 可是简单用下是能够的,固然有比较好的作法,我洗耳恭听php
在不发生跨域问题的状况下,使用$.ajax通常是能获取到响应的html
$.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
jquery
<?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默认也只识别这种。ajax
可是经过第三方POST测试工具(好比PostMan等)发送application/x-www-form-urlencoded、raw-json、form-data都没法获取正确的响应 (格式不对、须要解码等)json
也就是说用浏览器的跟工具是没法统一的,这时候只需简单作个判断就能够了跨域
/** * 本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!app