PHP的http_build_query函數(shù)如何正確處理布爾值?

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)行分析。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享