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!
时间: 2024-12-07 19:34:22