Amadeus API错误32171(必填数据缺失):PHP多城市航班搜索问题求助
多城市航班搜索Amadeus API报错(32171: MANDATORY DATA MISSING)排查
我正在开发基于Amadeus API的多城市航班搜索应用,发送请求时收到错误码32171,提示“MANDATORY DATA MISSING”。以下是我的PHP代码:
$str=' { "originDestinations": [ { "id": "1", "originLocationCode": "BCN", "destinationLocationCode": "MAD", "departureDateTimeRange": { "date": "2023-07-09", "time": "10:00:00" }, "arrivalDateTimeRange":{ "date": "2023-07-10", "time": "10:00:00" } }, { "id": "2", "originLocationCode": "MAD", "destinationLocationCode": "ATH", "departureDateTimeRange": { "date": "2023-07-11", "time": "10:00:00" } , "arrivalDateTimeRange":{ "date": "2023-07-12", "time": "10:00:00" } } ], "travelers": [ { "id": "1", "travelerType": "ADULT", "fareOptions": [ "STANDARD" ] }, { "id": "2", "travelerType": "HELD_INFANT", "associatedAdultId": "1", "fareOptions": [ "STANDARD" ] } ], "sources": [ "GDS" ] } '; $arr=json_decode($str,true); $fanal_arrr=array( 'getFlightOffersBody'=>$arr, 'X-HTTP-Method-Override'=>'GET' );
API返回错误:
"code":32171,"title":"MANDATORY DATA MISSING"
问题原因及修正方案
1. 错误的航段时间参数
Amadeus多城市航班搜索API中,每个航段仅需指定departureDateTimeRange,不需要arrivalDateTimeRange。后者仅适用于单程/往返行程的返程段,多城市模式下额外添加该字段会导致API参数解析异常,误判为缺少必填项。
2. 请求方法与参数结构不匹配
你设置了X-HTTP-Method-Override: GET,同时用getFlightOffersBody包裹请求体,但Amadeus的Flight Offers Search API有两种调用模式:
- GET模式:用查询参数传递所有条件,不支持复杂的多城市结构
- POST模式:用JSON请求体传递参数,是多城市搜索的正确方式
因此需要移除X-HTTP-Method-Override头,直接以POST方式发送正确的JSON体。
修正后的代码示例
$str = '{ "originDestinations": [ { "id": "1", "originLocationCode": "BCN", "destinationLocationCode": "MAD", "departureDateTimeRange": { "date": "2023-07-09", "time": "10:00:00" } }, { "id": "2", "originLocationCode": "MAD", "destinationLocationCode": "ATH", "departureDateTimeRange": { "date": "2023-07-11", "time": "10:00:00" } } ], "travelers": [ { "id": "1", "travelerType": "ADULT", "fareOptions": ["STANDARD"] }, { "id": "2", "travelerType": "HELD_INFANT", "associatedAdultId": "1", "fareOptions": ["STANDARD"] } ], "sources": ["GDS"] }'; $arr = json_decode($str, true); // 以POST方式发送请求(示例用curl) $ch = curl_init('https://test.api.amadeus.com/v2/shopping/flight-offers'); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer YOUR_ACCESS_TOKEN', // 替换为你的有效token 'Content-Type: application/json' ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arr)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); // 处理响应 var_dump(json_decode($response, true));
内容的提问来源于stack exchange,提问作者abolfazl adibdoost
相关产品推荐
相关产品推荐

