从 Curl APi 调用输出 JSON 到 Ajax
Outputting JSON from Curl APi call to Ajax
我正在做一个课程项目,我需要使用 php 来拨打 api 电话。
Ajax 调用如下所示:
$('#btnOneRun').click(function() {
$.ajax({
url: "libs/php/getCapitalSummary.php",
type: 'POST',
dataType: 'json',
success: function(result) {
if (result.status.name == "ok") {
console.log(result)
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(errorThrown)
}
});
});
php api 调用如下所示:
<?php
// remove for production
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
$url='http://api.geonames.org/wikipediaSearchJSON?formatted=true&q=london&maxRows=1&username=flightltd&style=full';
$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['data'] = $decode['geonames'];
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($output);
?>
这非常有效。我使用相同的例程对 geonames API 进行类似的调用,并且这样做没有任何问题,因为它们提供了根对象的名称 returned。在上面的例子中,它被称为 geonames
$output['data'] = $decode['geonames'];
我正在尝试使用此模式调用 accuweather API。但是,为此,我没有根对象的名称。
我使用了上面的例程,将特定代码行更改为 $output['data'] = $result;
瞧,我可以看到 geonames
的来源。
{
"status": {
"code": "200",
"name": "ok",
"description": "success",
"returnedIn": "120 ms"
},
"data": "{\"geonames\": [{\n \"summary\": \"London is the capital and most populous city of England and the United Kingdom. Standing on the River Thames, London has been a major settlement for two millennia, its history going back to its founding by the Romans, who named it Londinium (...)\",\n \"elevation\": 8,\n \"geoNameId\": 2643743,\n \"feature\": \"city\",\n \"lng\": -0.11832,\n \"countryCode\": \"GB\",\n \"rank\": 100,\n \"thumbnailImg\": \"http://www.geonames.org/img/wikipedia/43000/thumb-42715-100.jpg\",\n \"lang\": \"en\",\n \"title\": \"London\",\n \"lat\": 51.50939,\n \"wikipediaUrl\": \"en.wikipedia.org/wiki/London\"\n}]}"
}
此时我想:“现在我只需要对 Accuweather 的 API 调用做同样的事情,我将能够找到我需要在 [=20 上的大括号之间键入的内容=] 但是当我尝试这样做时,JSON return 不会显示像上面那样的对象。
从 accuweather API 直接从我的 javascript 文件或通过他们网站上的示例调用时,JSON return 看起来像这样:
[
{
"LocalObservationDateTime": "2022-03-10T06:47:00+00:00",
"EpochTime": 1646894820,
"WeatherText": "Light rain",
"WeatherIcon": 12,
"HasPrecipitation": true,
"PrecipitationType": "Rain",
"IsDayTime": true,
"Temperature": {
"Metric": {
"Value": 8,
"Unit": "C",
"UnitType": 17
},
"Imperial": {
"Value": 46,
"Unit": "F",
"UnitType": 18
}
},
"MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
"Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
}
]
我正在寻求两件事之一的帮助:
a) 一种在不知道对象名称的情况下解码 JSON 对象并将其输出到 AJAX 调用的方法,或者;
b) 在 javascript 上接收解码对象并对其进行解码以访问其属性。
非常感谢您。
编辑:我仔细研究了 PHP 并意识到我不明白 php 例程只是使用括号表示法来访问解码对象的属性:$decode['geonames']
.
我继续研究它并意识到我可以在我的 javascript 文件中使用 JSON.parse()
。
所以我将 php 文件中的特定代码行更改为 $output['data'] = $result;
然后在我的 ajax 调用中,我可以访问使用调用 JSON.parse(result.data)
后返回的 JSON 的属性,如下所示:
$('#btnOneRun').click(function() {
$.ajax({
url: "libs/php/getWeather.php",
type: 'POST',
dataType: 'json',
success: function(result) {
if (result.status.name == "ok") {
console.log(JSON.parse(result.data))
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(errorThrown)
}
});
});
这被记录为:
[
{
"LocalObservationDateTime": "2022-03-10T08:13:00+00:00",
"EpochTime": 1646899980,
"WeatherText": "Mostly cloudy",
"WeatherIcon": 6,
"HasPrecipitation": false,
"PrecipitationType": null,
"IsDayTime": true,
"Temperature": {
"Metric": {
"Value": 9.1,
"Unit": "C",
"UnitType": 17
},
"Imperial": {
"Value": 48,
"Unit": "F",
"UnitType": 18
}
},
"MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
"Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
}
]
我正在做一个课程项目,我需要使用 php 来拨打 api 电话。
Ajax 调用如下所示:
$('#btnOneRun').click(function() {
$.ajax({
url: "libs/php/getCapitalSummary.php",
type: 'POST',
dataType: 'json',
success: function(result) {
if (result.status.name == "ok") {
console.log(result)
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(errorThrown)
}
});
});
php api 调用如下所示:
<?php
// remove for production
ini_set('display_errors', 'On');
error_reporting(E_ALL);
$executionStartTime = microtime(true);
$url='http://api.geonames.org/wikipediaSearchJSON?formatted=true&q=london&maxRows=1&username=flightltd&style=full';
$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['data'] = $decode['geonames'];
header('Content-Type: application/json; charset=UTF-8');
echo json_encode($output);
?>
这非常有效。我使用相同的例程对 geonames API 进行类似的调用,并且这样做没有任何问题,因为它们提供了根对象的名称 returned。在上面的例子中,它被称为 geonames
$output['data'] = $decode['geonames'];
我正在尝试使用此模式调用 accuweather API。但是,为此,我没有根对象的名称。
我使用了上面的例程,将特定代码行更改为 $output['data'] = $result;
瞧,我可以看到 geonames
的来源。
{
"status": {
"code": "200",
"name": "ok",
"description": "success",
"returnedIn": "120 ms"
},
"data": "{\"geonames\": [{\n \"summary\": \"London is the capital and most populous city of England and the United Kingdom. Standing on the River Thames, London has been a major settlement for two millennia, its history going back to its founding by the Romans, who named it Londinium (...)\",\n \"elevation\": 8,\n \"geoNameId\": 2643743,\n \"feature\": \"city\",\n \"lng\": -0.11832,\n \"countryCode\": \"GB\",\n \"rank\": 100,\n \"thumbnailImg\": \"http://www.geonames.org/img/wikipedia/43000/thumb-42715-100.jpg\",\n \"lang\": \"en\",\n \"title\": \"London\",\n \"lat\": 51.50939,\n \"wikipediaUrl\": \"en.wikipedia.org/wiki/London\"\n}]}"
}
此时我想:“现在我只需要对 Accuweather 的 API 调用做同样的事情,我将能够找到我需要在 [=20 上的大括号之间键入的内容=] 但是当我尝试这样做时,JSON return 不会显示像上面那样的对象。
从 accuweather API 直接从我的 javascript 文件或通过他们网站上的示例调用时,JSON return 看起来像这样:
[
{
"LocalObservationDateTime": "2022-03-10T06:47:00+00:00",
"EpochTime": 1646894820,
"WeatherText": "Light rain",
"WeatherIcon": 12,
"HasPrecipitation": true,
"PrecipitationType": "Rain",
"IsDayTime": true,
"Temperature": {
"Metric": {
"Value": 8,
"Unit": "C",
"UnitType": 17
},
"Imperial": {
"Value": 46,
"Unit": "F",
"UnitType": 18
}
},
"MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
"Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
}
]
我正在寻求两件事之一的帮助:
a) 一种在不知道对象名称的情况下解码 JSON 对象并将其输出到 AJAX 调用的方法,或者;
b) 在 javascript 上接收解码对象并对其进行解码以访问其属性。
非常感谢您。
编辑:我仔细研究了 PHP 并意识到我不明白 php 例程只是使用括号表示法来访问解码对象的属性:$decode['geonames']
.
我继续研究它并意识到我可以在我的 javascript 文件中使用 JSON.parse()
。
所以我将 php 文件中的特定代码行更改为 $output['data'] = $result;
然后在我的 ajax 调用中,我可以访问使用调用 JSON.parse(result.data)
后返回的 JSON 的属性,如下所示:
$('#btnOneRun').click(function() {
$.ajax({
url: "libs/php/getWeather.php",
type: 'POST',
dataType: 'json',
success: function(result) {
if (result.status.name == "ok") {
console.log(JSON.parse(result.data))
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(errorThrown)
}
});
});
这被记录为:
[
{
"LocalObservationDateTime": "2022-03-10T08:13:00+00:00",
"EpochTime": 1646899980,
"WeatherText": "Mostly cloudy",
"WeatherIcon": 6,
"HasPrecipitation": false,
"PrecipitationType": null,
"IsDayTime": true,
"Temperature": {
"Metric": {
"Value": 9.1,
"Unit": "C",
"UnitType": 17
},
"Imperial": {
"Value": 48,
"Unit": "F",
"UnitType": 18
}
},
"MobileLink": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us",
"Link": "http://www.accuweather.com/en/gb/london/ec4a-2/current-weather/328328?lang=en-us"
}
]