이 메서드는 지정된 여정의 대략적인 티켓팅 그룹을 제공합니다. 여기에는 동일한 티켓으로 예약할 수 있는 선택된 서비스 클래스가 있는 세그먼트 집합과 티켓 전체의 운임 및 이용 가능 여부 정보가 포함됩니다. 참고:
- 모든 ticketing_.*_id (SegmentKey의 일부)는 Google 대중교통 티켓 판매 확장 프로그램에 제공된 항목을 참조합니다.
- 식별자는 안정적이어야 하며 GTFS 통합 요구사항에 언급된 대로 이러한 식별자의 변경사항은 하위 호환되어야 합니다.
GetTripOptionsRequest
Proto 정의
// Request sent to partners. message GetTripOptionsRequest { // All segments together should form a single trip for which a ticket can be // booked. repeated ext.travel.transport.partner.SegmentKey segment_keys = 1; }
JSON 샘플
{ "segment_keys": [ { "ticketing_trip_id": "123456", "from_ticketing_stop_time_id": "ZRH-1234", "to_ticketing_stop_time_id": "LUZ-1235", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 14, "minutes": 25, "seconds": 0, "nanos": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 16, "minutes": 25, "seconds": 0, "nanos": 0, "utc_offset": "0s" } }, { "ticketing_trip_id": "234567", "from_ticketing_stop_time_id": "LUZ-2759", "to_ticketing_stop_time_id": "WOL-2455", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 18, "minutes": 13, "seconds": 0, "nanos": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 20, "minutes": 13, "seconds": 0, "nanos": 0, "utc_offset": "0s" } } ] }
GetTripOptionsResponse
Proto 정의
// Response received from partners. message GetTripOptionsResponse { oneof response { TripOptionsResult trip_options_result = 1; TripOptionsError trip_options_error = 2; } } // A successful partner response. message TripOptionsResult { // Note: // - A TripOption represents the fare for a combination of available service // classes for the segments in the request. // - If the seats within a service class are sold at different fares of // limited availability, a different TripOption instance with the same // sequence of segments can be returned for each fare. // Partners should also include options that are unavailable because they are // fully booked, using the appropriate Unavailable message below. repeated TripOption trip_options = 1; } // A travel option for users covering the whole end-to-end journey with the // partner. message TripOption { // A series of Segments that cover the whole trip option, one for each // SegmentKey in the request. repeated Segment segments = 1; // This is the lowest standard fare of all seats with the specified segments. // This field is optional if the series of segments is unavailable. // This "standard fare" should be the lowest seat price where no age or other // booking restrictions apply. The currency should be the local currency of // the origin of the first segment. Fare lowest_standard_fare = 2; // The availability status for bookings of this trip option at the // lowest_standard_fare. Availability availability = 3; // This is used to receive optional extra data via the Travel Transport API // and pass it into the ticketing deep link. // Booking links should still work without the booking token, but the token // can be used to ensure price consistency between Google Search results and // the partner booking page. string booking_token = 4 [features.field_presence = EXPLICIT]; } // A segment traveled on a single vehicle in a given Service Class. message Segment { SegmentKey segment_key = 1; // The service class used on this segment. ServiceClass service_class = 2; }
JSON 샘플
{ "trip_options_result": { "trip_options": [ { "segments": [ { "segment_key": { "ticketing_trip_id": "123456", "from_ticketing_stop_time_id": "ZRH-1234", "to_ticketing_stop_time_id": "LUZ-1235", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 14, "minutes": 25, "seconds": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 16, "minutes": 25, "seconds": 0, "utc_offset": "0s" } }, "service_class": { "type": "FIRST_CLASS" } }, { "segment_key": { "ticketing_trip_id": "234567", "from_ticketing_stop_time_id": "LUZ-2759", "to_ticketing_stop_time_id": "WOL-2455", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 18, "minutes": 13, "seconds": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 20, "minutes": 13, "seconds": 0, "utc_offset": "0s" } }, "service_class": { "type": "FIRST_CLASS" } } ], "lowest_standard_fare": { "total_amount": { "units": 15, "nanos": 0, "currency_code": "CHF" }, "line_items": [ { "line_item_type": "BASE_FARE", "amount": { "units": 13, "nanos": 950000000, "currency_code": "CHF" } }, { "line_item_type": "SERVICE_CHARGE", "amount": { "units": 1, "nanos": 50000000, "currency_code": "CHF" } } ] }, "availability": { "available": { "available_seat_count": 10, "total_seat_count": 30 } } }, { "segments": [ { "segment_key": { "ticketing_trip_id": "123456", "from_ticketing_stop_time_id": "ZRH-1234", "to_ticketing_stop_time_id": "LUZ-1235", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 14, "minutes": 25, "seconds": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 16, "minutes": 25, "seconds": 0, "utc_offset": "0s" } }, "service_class": { "type": "SECOND_CLASS" } }, { "segment_key": { "ticketing_trip_id": "234567", "from_ticketing_stop_time_id": "LUZ-2759", "to_ticketing_stop_time_id": "WOL-2455", "service_date": { "year": 2022, "month": 4, "day": 6 }, "boarding_time": { "year": 2022, "month": 4, "day": 6, "hours": 18, "minutes": 13, "seconds": 0, "utc_offset": "0s" }, "arrival_time": { "year": 2022, "month": 4, "day": 6, "hours": 20, "minutes": 13, "seconds": 0, "utc_offset": "0s" } }, "service_class": { "type": "SECOND_CLASS" } } ], "lowest_standard_fare": { "total_amount": { "units": 10, "nanos": 0, "currency_code": "CHF" }, "line_items": [ { "line_item_type": "BASE_FARE", "amount": { "units": 9, "nanos": 750000000, "currency_code": "CHF" } }, { "line_item_type": "SERVICE_CHARGE", "amount": { "units": 0, "nanos": 250000000, "currency_code": "CHF" } } ] }, "availability": { "available": { "available_seat_count": 44, "total_seat_count": 200 } } } ] } }
JSON 오류 샘플
{ "trip_options_error": { "error_type": "SEGMENT_KEY_NOT_FOUND", "error_message": "No matching segments found, no departures at 14:25" } }
API 구현 참고사항:
향후 변경사항과의 호환성을 위해 세그먼트 키에서 추가 매개변수가 발견되면 항상 응답에 다시 반환하세요. 그렇지 않으면 매개변수를 무시하고 매개변수에 대한 특정 지원을 구현할 때까지 요청이 없는 것처럼 처리합니다.
오류 응답
다음 표에서는 이 메서드의 오류 보고 기대치를 설명합니다.
오류 유형 | 재시도 가능 | HTTP 상태 코드 | 설명 |
---|---|---|---|
SEGMENT_KEY_NOT_FOUND |
아니요 | 404 | 제공된 SegmentKey 중 하나에 해당하는 세그먼트를 찾을 수 없습니다. |
TRIP_OPTION_CACHE_STALE |
예 | 404 | 요청된 이동 옵션의 데이터가 파트너에서 최신 상태가 아니므로 Google에 제공하려면 새로고침해야 합니다. |
INTERNAL_ERROR |
예 | 500 | 이 여행을 가져오는 중에 예기치 않은 오류가 발생했습니다. 이는 파트너가 수정해야 하는 버그를 나타냅니다. |
SUBOPTIMAL_ITINERARY |
아니요 | 404 | 여정을 찾았지만 파트너가 최적의 여정이 아니라고 판단하여 티켓을 판매하지 않기로 했습니다. |
TICKETING_PROHIBITED |
아니요 | 404 | 여행이 확인되었지만 운영자 또는 철도 당국에서 부과한 일반 티켓 판매 제한으로 인해 파트너가 티켓을 판매할 수 없습니다. |
BOOKING_WINDOW_NOT_SUPPORTED |
아니요 | 404 | 파트너가 요청된 날짜의 여행 일정 가격을 지원하지 않습니다. |
자세한 내용은 TripOptionsErrorType
를 참고하세요.
HTTP 응답의 상태 코드 반환은 상태 코드 및 오류 처리를 참고하세요.