PHP中如何从API返回的JSON提取items字段的Token值
问题描述
我从API拿到的JSON响应如下:
{"error":null,"response":{"items":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6MCwiSWRVdGVudGUiOjEzLCJJZFByb2ZpbG8iOjEsIklkQ29sbGFib3JhdG9yZSI6LTEsIklkRmlsaWFsZSI6LTEsIkNsb3VkSWQiOiI4MTI0MSIsIlVzZXJJZCI6bnVsbCwiV2ViVG9rZW4iOm51bGwsIkFzc29jaWF0ZXNDdXN0b21lck1hbnVhbGx5IjpmYWxzZSwiVG9rZW5DcmVhdGlvbkRhdGUiOiIyMDIyLTExLTA4VDEyOjI3OjE5LjQ5NDA5NDUrMDE6MDAifQ.prRo4mTA3a7M65UG_aSRQYCxsqwbwDYmUbv3Tbz4cYY","message":null}}
我需要提取其中items字段的Token值。现有PHP代码通过Curl调用API并将响应转为数组,但还没正确提取Token:
add_filter( 'gform_field_value_token', 'scrivi_token' ); function scrivi_token ( $value ) { $url = 'https://leads-cert.creditopratico.it/api/login'; #Assumption: The params below have already been verified. $topup_data = array("username" => "**********", "password" => "**********", "cloudId" => "**********"); #JSON encode the params $topup_str = json_encode($topup_data); #Curl init $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: '.strlen($topup_str) ) ); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $topup_str); $result = curl_exec($ch); $array = json_decode($result, true); print_r($array); // ARRAY return $token; //pass the value to the field that interests me
代码输出的数组结构如下:
Array ( [error] => [response] => Array ( [items] => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6MCwiSWRVdGVudGUiOjEzLCJJZFByb2ZpbG8iOjEsIklkQ29sbGFib3JhdG9yZSI6LTEsIklkRmlsaWFsZSI6LTEsIkNsb3VkSWQiOiI4MTI0MSIsIlVzZXJJZCI6bnVsbCwiV2ViVG9rZW4iOm51bGwsIkFzc29jaWF0ZXNDdXN0b21lck1hbnVhbGx5IjpmYWxzZSwiVG9rZW5DcmVhdGlvbkRhdGUiOiIyMDIyLTExLTA4VDE2OjUwOjQyLjA2Mjc1MTcrMDE6MDAifQ.ErluSsrhMCBml3M2P5Pto14zF0zl4sZscFielmaF2Lc [message] => ) )
我尝试用$token = $array['response']['items'];提取Token,但不确定是否正确,需要完善代码实现需求。
解决方案
你的思路是正确的,$array['response']['items']确实能提取到目标Token值。需要在代码中补充赋值逻辑,同时建议增加错误处理,避免API响应异常导致的报错。完善后的代码如下:
add_filter( 'gform_field_value_token', 'scrivi_token' ); function scrivi_token ( $value ) { $url = 'https://leads-cert.creditopratico.it/api/login'; // 已验证的请求参数 $topup_data = array( "username" => "**********", "password" => "**********", "cloudId" => "**********" ); // JSON编码参数 $topup_str = json_encode($topup_data); // 初始化Curl $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: '.strlen($topup_str) )); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $topup_str); $result = curl_exec($ch); // 检查Curl请求是否成功 if(curl_errno($ch)){ curl_close($ch); return $value; // 请求失败时返回原字段值 } curl_close($ch); $array = json_decode($result, true); // 检查JSON解析结果及目标字段是否存在 if(is_array($array) && isset($array['response']['items'])){ $token = $array['response']['items']; return $token; } // 字段不存在时返回原字段值 return $value; }
关键说明:
- 增加Curl错误检查:通过
curl_errno($ch)判断请求是否失败,避免后续逻辑报错。 - 增加字段存在性验证:用
isset($array['response']['items'])确保目标字段存在,防止未定义索引错误。 - 规范代码格式:调整缩进和注释,提升可读性。
内容的提问来源于stack exchange,提问作者Giandomenico Viglione
相关产品推荐
相关产品推荐

