【发布时间】:2021-10-22 15:51:00
【问题描述】:
当我单击一个按钮时,该按钮被编程为从 Protected Planet 的 API 接收数据,我收到一个似乎无法解决的错误。我已经看到isset() 解决方案,但不知道它们是否适用于我的情况,因为我在设置中建议他们从数据库请求密码/登录请求。
我收到此错误:
<br />
<b>Warning</b>: Trying to access array offset on value of type null in <b>C:\xampp\htdocs\project1\libs\php\getProtectedPlanet.php</b> on line <b>25</b><br />
{"status":{"code":"200","name":"ok","description":"success","returnedIn":"101 ms"},"output":null}
Url 正在返回预期的结果。
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
$url='http://api.protectedplanet.net/v3/countries/' . $_REQUEST['iso'] . '?token=[REDACTED API TOKEN]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
curl_close($ch);
$decode = json_decode($result,true);
$output['status']['code'] = "200";
$output['status']['name'] = "ok";
$output['status']['description'] = "success";
$output['status']['returnedIn'] = intval((microtime(true) - $executionStartTime) * 1000) . " ms";
$output['output'] = $decode["statistics"];
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($output);
?>
示例返回 json:
{"country":{
"name":"Canada",
"iso_3":"CAN",
"id":"CAN",
"geojson":{
"type":"Feature",
"properties":{
"fill-opacity":0.7,
"stroke-width":0.05,
"stroke":"#40541b",
"fill":"#83ad35",
"marker-color":"#2B3146"
},
"geometry":{
"type":"Polygon",
"coordinates":[
[[-141.006,41.669],[-141.006,83.117],[-52.617,83.117],[-52.617,41.669],[-141.006,41.669]]
]
}
},
"statistics":{
"pa_land_area":1185787.371,
"pa_marine_area":504723.3908,
"land_area":9955032.941,
"percentage_pa_land_cover":11.91143608,
"percentage_pa_marine_cover":8.857775688,
"marine_area":5698082.708,
"polygons_count":9110,
"points_count":20},
"pame_statistics":{
"assessments":74,
"assessed_pas":60,
"pame_pa_land_area":307619.9491,
"pame_percentage_pa_land_cover":3.090094805,
"pame_pa_marine_area":6980.110537,
"pame_percentage_pa_marine_cover":0.122499287
},
"region":{
"name":"North America","iso":"NA"
},
"pas_count":9130,
"pas_national_count":7958,
"pas_regional_count":0,
"pas_international_count":64,
"pas_with_iucn_category_count":9130,
"pas_with_iucn_category_percentage":100.0,
"links": ...data truncated
我主要想访问"statistics" 键。
ajax 调用开始:
var getProtectedPlanetAPI = function() {
console.log("Button clicked");
console.log(isoa3);
$.ajax({
url: "libs/php/getProtectedPlanet.php",
type: 'POST',
dataType: 'json',
data: {
iso: isoa3
},
success: function(result) {...
正确的 iso 记录到控制台
【问题讨论】:
-
您是否已验证 cURL 正在返回有效响应? IE:
var_dump($result);在尝试处理数组/响应之前 -
我收到了
301 Moved Permanently回复。 -
你需要 curl 配置中的另一个选项 -
CURLOPT_FOLLOWLOCATION~ 设置为 true -
顺便说一句,api端点是安全的SSL,所以url应该是
https,你应该真正使用正确的选项来处理curl中的SSL,而不是打开自己到MITM -
啊,你帮我解决了这个问题,太棒了,谢谢!关于 cURL 中 SLL 的正确选项,哪里是最好的阅读资源?我已将
CURLOPT_SSL_VERIFYPEER设置为 true,但我想这只是众多预防措施之一?