【问题标题】:Trouble With API Curl Response(php)API卷曲响应问题(php)
【发布时间】:2020-08-11 13:40:12
【问题描述】:

Company House API 的响应有问题。我正在从 php 页面发出以下 curl 请求:

$request_url_1 ='https://api.companieshouse.gov.uk/company/' ;
$company_number = 11495745;
$request_url_2 = '/officers';
$request_url = $request_url_1 . $company_number . $request_url_2;   
  $ch = curl_init($request_url); 
  $headers = array(
    'Content-Type: application/json',
    'Authorization: Basic '. base64_encode("$chkey:")
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  $content = curl_exec($ch); 
  curl_close( $ch ); 
  $contents = json_decode($content,true); 

以下是发送 curl 请求后在 php 页面上“粘贴”的响应,我似乎无法获取应该包含 curl 响应的 $contents 变量的内容/值。

 {
   "active_count":1,
   "items_per_page":35,
   "kind":"officer-list",
   "etag":"6cc48213158205c9fa85492a4c2ef0a98b56b2f1",
   "resigned_count":2,
   "items":[
      {
         "date_of_birth":{
            "year":1963,
            "month":2
         },
         "appointed_on":"2019-08-01",
         "nationality":"British",
         "address":{
            "address_line_1":"Moorside Crescent",
            "country":"United Kingdom",
            "address_line_2":"Sinfin",
            "postal_code":"DE24 9PH",
            "locality":"Derby",
            "premises":"75"
         },
         "occupation":"Company Director",
         "links":{
            "officer":{
               "appointments":"/officers/IryiaaBZodlGNaOP0Rf3Pb2GnO8/appointments"
            }
         },
         "name":"MILLER, Eira",
         "country_of_residence":"England",
         "officer_role":"director"
      },
      {
         "date_of_birth":{
            "month":3,
            "year":1987
         },
         "nationality":"English",
         "occupation":"Company Director",
         "address":{
            "locality":"Derby",
            "address_line_1":"Moorside Crescent",
            "premises":"75",
            "country":"United Kingdom",
            "postal_code":"DE24 9PH",
            "address_line_2":"Sinfin"
         },
         "appointed_on":"2018-12-10",
         "resigned_on":"2019-07-31",
         "name":"KING, Kimberley Rachel",
         "links":{
            "officer":{
               "appointments":"/officers/av7G3-iF_9-FXhRH2xm-IxejeGQ/appointments"
            }
         },
         "country_of_residence":"United Kingdom",
         "officer_role":"director"
      },
      {
         "address":{
            "postal_code":"DE24 9PH",
            "locality":"Derby",
            "country":"United Kingdom",
            "premises":"75",
            "address_line_2":"Sinfin",
            "address_line_1":"Moorside Crescent"
         },
         "occupation":"Managing Director",
         "nationality":"British",
         "appointed_on":"2018-08-01",
         "resigned_on":"2018-12-10",
         "officer_role":"director",
         "country_of_residence":"United Kingdom",
         "links":{
            "officer":{
               "appointments":"/officers/X9nlVD6qIIENMjaH946__4CB3QE/appointments"
            }
         },
         "name":"MARTIN, Katey",
         "date_of_birth":{
            "month":6,
            "year":1968
         }
      }
   ],
   "links":{
      "self":"/company/11495745/officers"
   },
   "inactive_count":0,
   "start_index":0,
   "total_results":3
}

我尝试将结果作为非关联数组返回并通过普通数组访问它,但那里也没有乐趣。

FluffyKitten 提供以下代码来执行名称字段的提取:

$item = $contents["items"];
foreach($item as $items){
    echo $items["name"];
}   

但是,这无法访问所需的数据。 $contents 的 print_r 结果为 '1' 和 var_dump (1)

【问题讨论】:

  • 您发布的示例数据无效,可解析的 JSON。
  • 这不是有效的 JSON。
  • 另外,json_decode 的第二个参数为 true 会使其返回一个数组,但您正试图将属性作为循环中的对象访问。假设您在某处有一些有效的 json,请尝试删除第二个参数,或者正确访问数据。
  • 刚刚替换了json curl响应

标签: php api associative-array


【解决方案1】:

您的代码有几个问题:

  1. 您正在混淆用于访问数组和对象的代码
  2. 当不需要循环时,您正在循环

您正在使用json_decode($content,true),通过传入true 参数,您将结果转换为关联数组,但随后您尝试将items 作为对象的属性进行访问。

由于您已将内容转换为关联数组,因此您可以使用正确的键轻松访问所需的信息,例如:

$item = $contents["items"];
foreach($item as $items){
    echo "<p>".$items["name"];
}    

参考PHP json_decode Documentation

更新

你的问题已经完全改变了——它是关于如何用结果循环遍历变量,但现在看来问题是首先将结果保存为变量。

您需要将CURLOPT_RETURNTRANSFER option 设置为true,以便不直接输出结果(我假设这就是您将结果“粘贴”到 PHP 页面中的意思)。

将此添加到您的 CURL 代码中,并且如果您的其余代码正确,结果应保存在 $content 变量中,以便您可以使用它来循环使用上面的代码:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

【讨论】:

  • 谢谢你,但没有帮助 - api 响应将数据“粘贴”到我发出 url 请求的 php 页面上,我似乎无法理解'$contents' 变量的内容。
  • @Nick 我不明白你的意思是将数据“粘贴”到 php 页面上是什么意思?另外,您自己创建了$contents 变量——您的意思是问题出在$content 变量上吗?这看起来与您在问题中实际提出的问题不同,这是关于遍历数组的问题,因此请使用实际问题和相关代码的详细信息编辑您的问题,例如您用于调用 API 的代码,将 JSON 保存到 $content 变量等中。
  • 编辑问题
  • @Nick 我已经更新了我的答案 - 这应该可以,但是很难判断我们何时无法访问您的 API 以及您何时引用变量(例如 $chkey)你没有提到其他任何地方
  • 非常感谢您的耐心和专业知识。是的,标题更改与您的 JSON 解析一样有效。最初我正在做 CURL 返回的 print_r,所以没有意识到标题导致返回被打印在页面上。只有在取出 print_r 并且仍在打印 JSON 返回之后,我才意识到问题不在于 JSON 解析! ($chkey = 私有 API 凭证)。再次,FluffyKitten 非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2017-09-16
  • 1970-01-01
  • 2015-03-25
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多