You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:30:42