جستوجوی جریانی پرواز
نتایج پرواز را همان لحظه که میرسند از طریق Server-Sent Events (SSE) دریافت کنید تا اولین نتایج سریع نمایش داده شوند و فهرست بهتدریج کامل شود.
POST/Air/AirLowFareSearchIncremental
دسترسی نیازمند مجوز air_low_fare_search
این نسخهٔ جریانی (streaming) AirLowFareSearch است و همان بدنهٔ درخواست را میگیرد. بهجای یک پاسخ JSON، یک text/event-stream برمیگرداند. آن را بهصورت جریان بخوانید و اتصال را تا رسیدن رویداد done باز نگه دارید.
درخواست#
بدنهٔ درخواست دقیقاً مثل AirLowFareSearch است.
curl -N -X POST https://api.simorghapi.com/api/Air/AirLowFareSearchIncremental \
-H "Content-Type: application/json" \
-d '{
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"AdultCount": 1,
"PricingSourceType": "All",
"RequestOption": "All",
"TravelPreference": { "CabinType": 3 },
"OriginDestinationInformations": [
{ "OriginLocationCode": "IST", "DestinationLocationCode": "DXB", "DepartureDateTime": "2026-10-12T00:00:00" }
]
}'const res = await fetch("https://api.simorghapi.com/api/Air/AirLowFareSearchIncremental", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
SessionId: "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
AdultCount: 1,
PricingSourceType: "All",
RequestOption: "All",
TravelPreference: { CabinType: 3 },
OriginDestinationInformations: [
{ OriginLocationCode: "IST", DestinationLocationCode: "DXB", DepartureDateTime: "2026-10-12T00:00:00" }
]
})
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let itineraries = [];
while (true) {
const { value, done } = await reader.read();
if (done) break;
for (const block of decoder.decode(value).split("\n\n")) {
if (!block.startsWith("event:")) continue;
const event = block.match(/event: (.*)/)[1];
const data = JSON.parse(block.match(/data: (.*)/)[1]);
if (event === "itineraries") itineraries = data.PricedItineraries; // replace, do not append
if (event === "done") console.log("finished", data.Total);
}
}import json
import requests
payload = {
"SessionId": "8f3c81d2-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"AdultCount": 1,
"PricingSourceType": "All",
"RequestOption": "All",
"TravelPreference": {"CabinType": 3},
"OriginDestinationInformations": [
{"OriginLocationCode": "IST", "DestinationLocationCode": "DXB", "DepartureDateTime": "2026-10-12T00:00:00"}
],
}
with requests.post(
"https://api.simorghapi.com/api/Air/AirLowFareSearchIncremental",
json=payload, stream=True,
) as res:
event = None
for line in res.iter_lines(decode_unicode=True):
if line.startswith("event:"):
event = line.split(": ", 1)[1]
elif line.startswith("data:"):
data = json.loads(line.split(": ", 1)[1])
if event == "itineraries":
itineraries = data["PricedItineraries"] # replace, do not appendپاسخ#
پاسخ، جریانی از رویدادهاست. هر رویداد یک خط event و یک خط data دارد.
| رویداد | داده | معنا |
|---|---|---|
itineraries | { "PricedItineraries": [ ... ], "Replace": true } | سبد کامل فعلی نتایج. فهرست خود را با آن جایگزین کنید؛ به آن اضافه نکنید. |
done | { "Success": true, "SearchId": N, "Total": N } | رویداد پایانی؛ جستوجو تمام شد. SearchId مثل اندپوینت غیرجریانی (blocking) کار میکند. |
error | { "Success": false, "Error": { "Id", "Message" } } | رویداد پایانی؛ جستوجو ناموفق بود. |
event: itineraries
data: {"PricedItineraries":[ { "FareSourceCode": "...", "AirItineraryPricingInfo": { "ItinTotalFare": { "TotalFare": 219.60, "Currency": "USD" } } } ],"Replace":true}
event: itineraries
data: {"PricedItineraries":[ { "FareSourceCode": "..." }, { "FareSourceCode": "..." } ],"Replace":true}
event: done
data: {"Success":true,"SearchId":428713,"Total":137}
جایگزین کنید، اضافه نکنید.
هر رویداد
itineraries کل سبد نتایج تا آن لحظه را، مرتبشده و بدون تکرار، در خود دارد. هر بار فهرست خود را بازنویسی کنید، نه اینکه به آن اضافه کنید.
ویرایش این صفحه در گیتهابمشکلی دیدید؟ از پنل ← پشتیبانی خبرمان کنید.