调用GuzzleHttp\Command\Result::getBody()报错,Drupal API响应无键名
解决Drupal HTTP Client Manager返回无键名Result对象的问题
问题分析
你调用外部API后得到的GuzzleHttp\Command\Result对象,是HTTP Client Manager封装后的解析结果,并非原始Guzzle响应对象,所以无法使用getBody()或getContent()这类方法。当前返回的索引数组,说明API响应的结构是无键名的数组,或者客户端的接口定义(如Swagger/OpenAPI)未正确映射响应的键名。
解决方案
1. 手动映射键名(快速解决)
利用Result对象的toArray()方法提取原始索引数组,然后根据API返回的字段顺序手动映射为带键名的结构:
public function findPosts() { $client = $this->getClient(); $params = [ 'client_Id' => "12345", "client_Secret" => "42452454", "scope" => "read" ]; $response = $client->FindPosts($params); // 将Result对象转为索引数组 $rawData = $response->toArray(); // 根据API返回的字段顺序映射键名 $formattedResponse = [ 'access_token' => $rawData[0] ?? null, 'token_type' => $rawData[1] ?? null, 'expires_in' => $rawData[2] ?? null, 'issued_at' => $rawData[3] ?? null, 'scope' => $rawData[4] ?? null, 'refresh_token' => $rawData[5] ?? null, 'refresh_expires_in' => $rawData[6] ?? null, 'refresh_issued_at' => $rawData[7] ?? null, ]; dpm($formattedResponse); return ['#markup' => print_r($formattedResponse, true)]; }
2. 修正客户端接口定义(彻底解决)
如果API实际返回的是带键名的JSON对象,那问题出在HTTP Client Manager的客户端配置上:
- 检查创建客户端时使用的Swagger/OpenAPI定义文件,确认响应模型是否被错误定义为数组类型
- 将响应模型修正为对象类型(包含
access_token、token_type等字段的Schema),重新生成客户端后,Result对象会直接返回带键名的结构,无需手动映射
关键说明
GuzzleHttp\Command\Result实现了ArrayAccess接口,你也可以直接通过数组方式访问元素,比如$response[0],但推荐使用toArray()方法获取完整数据。
内容的提问来源于stack exchange,提问作者Misori
相关产品推荐
相关产品推荐

