php - Amadeus Flight search api在curl php中传递access_token时出错
问题描述
我正在集成 amadeus 航班搜索 api 并在使用 access_token 时出错。我想问题在于检索访问令牌?
{ "errors": [ { "code": "38191", "title": "Invalid HTTP header", "detail": "Missing or invalid format for mandatory Authorization header", "status": "401" } ] }
我需要获取从源头到目的地的所有航班以及价格详情。
$curls = curl_init();
curl_setopt($curls, CURLOPT_URL, 'https://test.api.amadeus.com/v1/security/oauth2/token');
curl_setopt($curls, CURLOPT_POST, true);
curl_setopt($curls, CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id=$secretid&client_secret=$secretkey");
curl_setopt($curls, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$token = curl_exec($curls);
$data = json_decode($token,true);
curl_setopt($curls, CURLOPT_URL, 'https://test.api.amadeus.com/v2/shopping/flight-offers?originLocationCode=SYD&destinationLocationCode=BKK&departureDate=2020-10-01&returnDate=2020-08-05&adults=2&includedAirlineCodes=TG&max=3');
curl_setopt($curls, CURLOPT_HTTPHEADER, array('Authorization: Bearer' .$data['access_token']));
$result = curl_exec($curls);
if (curl_errno($curls)) {
echo 'Error:' . curl_error($curls);
}
//print_r ($result);
curl_close ($curls);
解决方案
我在您的代码中发现了一些错误并对其进行了修复以使其正常工作:
- 对于您使用的 PHP 版本,您需要添加
curl_setopt($curls, CURLOPT_RETURNTRANSFER, true);
以确保它不仅打印 API 响应,而且还返回它(请参阅这篇文章) - 您需要在 Bearer 和访问令牌之间留一个空格:
array('Authorization: Bearer ' .$data['access_token']));
- 您尝试调用的示例是错误的,返回日期早于出发日期。我将其更改为一个更简单的示例:
https://test.api.amadeus.com/v2/shopping/flight-offers?originLocationCode=EWR&destinationLocationCode=MIA&departureDate=2020-09-10&returnDate=2020-09-17&adults=1&max=1
. 请查看API 参考文档以了解您可以使用的不同查询参数。 - 在进行 API 调用之前,您需要将 更改
CURLOPT_POST
为 false (因为您尝试调用的 API 是GET
)
在下面找到完整的示例:
$curls = curl_init();
curl_setopt($curls, CURLOPT_URL, 'https://test.api.amadeus.com/v1/security/oauth2/token');
curl_setopt($curls, CURLOPT_POST, true);
curl_setopt($curls, CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id=$secretid&client_secret=$secretkey");
curl_setopt($curls, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($curls, CURLOPT_RETURNTRANSFER, true);
$token = curl_exec($curls);
$data = json_decode($token,true);
curl_setopt($curls, CURLOPT_URL, 'https://test.api.amadeus.com/v2/shopping/flight-offers?originLocationCode=EWR&destinationLocationCode=MIA&departureDate=2020-09-10&returnDate=2020-09-17&adults=1&max=1');
curl_setopt($curls, CURLOPT_POST, false);
curl_setopt($curls, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' .$data['access_token']));
$result = curl_exec($curls);
if (curl_errno($curls)) {
echo 'Error:' . curl_error($curls);
}
print_r ($result);
curl_close ($curls);
注意:我不是 PHP 专家,我确信代码可以改进。
推荐阅读
- javascript - 为什么数组可以将键值对行为存储为 Javascript 中的对象?
- html - jquery 消息框无法显示 jquery
- json - Mongo 嵌入式文档不是 JSON 可序列化的 - Python
- function - 我如何能够从有状态小部件传递 setState 在无状态小部件中
- python - 在简单的 2D Python 游戏中更新角色的位置
- laravel - 在 twilio laravel 中按区号阻止呼叫
- php - 运行异步while函数或多线程
- ios - 使用蓝牙时如何设置超时间隔
- python - 使用大量“if”语句的替代方法
- java-8 - 带有 RadixSort、BucketSort、Java 8 的比较器接口