php 的 http_build_query 函數(shù)與布爾值處理
本文將討論 php 中 http_build_query 函數(shù)處理布爾值的方式,以及如何解決因其將布爾值轉(zhuǎn)換為 1 或 0 而導(dǎo)致的后端類型檢查錯(cuò)誤問題。
http_build_query 函數(shù)用于將 php 數(shù)組轉(zhuǎn)換為 url 查詢字符串。默認(rèn)情況下,它使用 rfc1738 規(guī)范進(jìn)行編碼。該規(guī)范并沒有明確規(guī)定如何處理布爾值,因此不同語言的實(shí)現(xiàn)可能略有差異。在 php 中,http_build_query 將布爾值 true 轉(zhuǎn)換為字符串 “1”,將 false 轉(zhuǎn)換為字符串 “0”。
這在與后端進(jìn)行 post 請(qǐng)求時(shí)可能會(huì)引發(fā)問題,因?yàn)楹蠖丝赡軙?huì)進(jìn)行嚴(yán)格的類型檢查,而 “1” 和 “0” 并非布爾值。如果后端期望接收真正的布爾值,則這種轉(zhuǎn)換會(huì)導(dǎo)致類型錯(cuò)誤。而 get 請(qǐng)求通常不會(huì)遇到此問題,因?yàn)?get 請(qǐng)求參數(shù)通常以字符串形式處理。
為了解決這個(gè)問題,可以在使用 http_build_query 之前,先使用 array_walk_recursive 函數(shù)遞歸遍歷數(shù)組,將布爾值轉(zhuǎn)換為字符串 “true” 或 “false”。以下代碼演示了如何實(shí)現(xiàn):
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
<?php $arr = [ 'id' => 1, 'is_admin' => false, 'permissions' => [ 'write' => false, 'read' => true, 'delete' => false, 'edit' => true, 'advanced' => [ 'report' => true, 'down' => true, ], ], ]; array_walk_recursive($arr, static function (&$val) { is_bool($val) && $val = $val ? 'true' : 'false'; }); echo http_build_query($arr); // id=1&is_admin=false&permissions%5Bwrite%5D=false&permissions%5Bread%5D=true&permissions%5Bdelete%5D=false&permissions%5Bedit%5D=true&permissions%5Badvanced%5D%5Breport%5D=true&permissions%5Badvanced%5D%5Bdown%5D=true
這段代碼會(huì)將數(shù)組中的所有布爾值轉(zhuǎn)換為字符串 “true” 或 “false”,然后 http_build_query 函數(shù)將處理轉(zhuǎn)換后的數(shù)組,生成正確的查詢字符串。
如果 post 請(qǐng)求仍然出現(xiàn)問題,需要檢查后端接收數(shù)據(jù)的方式。如果后端使用 x-www-form-urlencoded,其處理方式與 rfc1738 類似。如果后端使用 json 格式,則應(yīng)該直接使用 json 數(shù)據(jù),而不是使用 http_build_query。
python 請(qǐng)求能夠正常工作,可能是因?yàn)?python 的請(qǐng)求庫默認(rèn)處理了布爾值的轉(zhuǎn)換,或者使用了不同的編碼方式。 為了更好地理解問題所在,建議提供 python 請(qǐng)求代碼和后端代碼片段進(jìn)行分析。