用angularJS中的$http服務碰到了一個問題:運用$http.post方法向后臺傳遞數(shù)據(jù)時,后臺的php頁面獲取不到data參數(shù)傳過來的值。
不論是這種姿勢:
$http.post( "1.php", { id: 1 }).success(function (data) { console.log(data); });還是這種姿勢:
$http({ method: 'POST', url: '1.php', data: { id: 1 } }).success(function (data) { console.log(data); });后臺php中的$_POST或$_REQUEST都無法獲取到data中的值:
<?php echo json_encode($_POST);?>
輸出為一個空數(shù)組。為了測試php本身是不是真的獲取不到值,我就寫了個表單測試下:
<form action="1.php" method="post"> <input type="text" name="tid"> <input type="submit" value="submit"></form>
輸出結果為:{"tid":"2"},也就是說表單里的值是可以獲取的,但是用ajax發(fā)送的數(shù)據(jù)獲取不了!
那么表單數(shù)據(jù)和ajax發(fā)送的post數(shù)據(jù)之間有什么差異呢?于是我悄悄瞄一眼請求頭...
1.表單的請求頭部:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,ja;q=0.6Cache-Control: no-cacheConnection: keep-aliveContent-Length: 5Content-Type: application/x-www-form-urlencodedCookie: a0537_times=1Host: 127.0.0.1Origin: http://127.0.0.1Pragma: no-cacheReferer: http://127.0.0.1/angularTest/1.htmlUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
2.ajax發(fā)送的數(shù)據(jù)的請求頭部:
Accept: application/json, text/plain, */*Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,ja;q=0.6Cache-Control: no-cacheConnection: keep-aliveContent-Length: 10Content-Type: application/json;charset=UTF-8Cookie: a0537_times=1Host: 127.0.0.1Origin: http://127.0.0.1Pragma: no-cacheReferer: http://127.0.0.1/angularTest/1.htmlUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
問題一下子就出來了!表單發(fā)送的文本類型是表單類型,而angular的ajax默認發(fā)送的則是json數(shù)據(jù)。
那么怎么把Content-type給改了呢?于是我就打開了angular的官網,照著改一下請求頭:
$http({ method: 'POST', url: '1.php', data: { id : 1 } headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (data) { console.log(data); });于是輸出結果為:{"{/"test/":1}":""},還是有問題。對象并沒有自動地序列化(jQuery用習慣了都快忘了居然還有這個問題!)
那么解決方案有:
1.不寫成對象的形式,直接寫字符串:
$http({ method: 'POST', url: '1.php', data: 'test=1', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).success(function (data) { console.log(data); });
新聞熱點
疑難解答
圖片精選