这是非常笼统的,但我花了很长时间弄清楚如何使用一些更复杂的Sabre API。
我已经使用 WSDL 在 C# 中构建了工作 .NET 代理类,用于基本 API(CreateSession、CloseSession),但对于更复杂的 API,我很难解析复杂的 XML 模式来确定在我的程序中调用哪些方法。
是否有任何其他 .NET 资源/示例没有包含在 MVC 中,例如 Sabre 在 GitHub 上发布的代码示例?
我正在尝试弄清楚如何使用OTA_AirPriceLLSRQ和TravelRouteReadRQ等API。
提前感谢任何帮助!
正如我在评论中提到的,你不应该关注实际的MVC包装,因为你将主要把东西放在模型中,或者实际上你会把它放在其他地方并在模型中使用它。
无论如何,仅供您以示例为例,这是一个非常通用的BFM(BargianFinderMax)类。使用此方法时,需要创建一个实例,并且在调用 Execute 方法后,它将响应存储在实例中。
我希望它有所帮助。
using BargainFinderMaxRQv310Srvc;
using System;
using System.IO;
namespace ServicesMethods
{
public class BFM_v310
{
private BargainFinderMaxService service;
private OTA_AirLowFareSearchRQ request;
public OTA_AirLowFareSearchRS response;
public BFM_v310(string token, string pcc, string convId, string endpoint)
{
//MessageHeader
MessageHeader mHeader = new MessageHeader();
PartyId[] pId = { new PartyId() };
pId[0].Value = "SWS";
From from = new From();
from.PartyId = pId;
To to = new To();
to.PartyId = pId;
mHeader.Action = "BargainFinderMaxRQ";
mHeader.Service = new Service()
{
Value = mHeader.Action
};
mHeader.ConversationId = convId;
mHeader.CPAId = pcc;
mHeader.From = from;
mHeader.To = to;
mHeader.MessageData = new MessageData()
{
Timestamp = DateTime.UtcNow.ToString()
};
//Security
Security security = new Security();
security.BinarySecurityToken = token;
//Service
service = new BargainFinderMaxService();
service.MessageHeaderValue = mHeader;
service.SecurityValue = security;
service.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap11;
service.Url = endpoint;
createRequest(pcc);
}
private void createRequest(string pcc)
{
request = new BargainFinderMaxRQv310Srvc.OTA_AirLowFareSearchRQ();
request.AvailableFlightsOnly = true;
request.Version = "3.1.0";
request.POS = new SourceType[1];
SourceType source = new SourceType();
source.PseudoCityCode = pcc;
source.RequestorID = new UniqueID_Type();
source.RequestorID.ID = "1";
source.RequestorID.Type = "1";
source.RequestorID.CompanyName = new CompanyNameType();
source.RequestorID.CompanyName.Code = "TN";
source.RequestorID.CompanyName.CodeContext = "Context";
request.POS[0] = source;
OTA_AirLowFareSearchRQOriginDestinationInformation originDestination = new OTA_AirLowFareSearchRQOriginDestinationInformation();
originDestination.OriginLocation = new OriginDestinationInformationTypeOriginLocation();
originDestination.OriginLocation.LocationCode = "BCN";
originDestination.DestinationLocation = new OriginDestinationInformationTypeDestinationLocation();
originDestination.DestinationLocation.LocationCode = "MAD";
originDestination.ItemElementName = ItemChoiceType.DepartureDateTime;
originDestination.Item = "2017-09-10T12:00:00";
originDestination.RPH = "1";
request.OriginDestinationInformation = new OTA_AirLowFareSearchRQOriginDestinationInformation[1] { originDestination };
request.TravelerInfoSummary = new TravelerInfoSummaryType()
{
AirTravelerAvail = new TravelerInformationType[1]
};
request.TravelerInfoSummary.AirTravelerAvail[0] = new TravelerInformationType()
{
PassengerTypeQuantity = new PassengerTypeQuantityType[1]
};
PassengerTypeQuantityType passenger = new PassengerTypeQuantityType()
{
Quantity = "1",
Code = "ADT"
};
request.TravelerInfoSummary.AirTravelerAvail[0].PassengerTypeQuantity[0] = passenger;
request.TravelerInfoSummary.PriceRequestInformation = new PriceRequestInformationType();
request.TravelerInfoSummary.PriceRequestInformation.CurrencyCode = "USD";
//PriceRequestInformationTypeNegotiatedFareCode nego = new PriceRequestInformationTypeNegotiatedFareCode();
//nego.Code = "ABC";
//request.TravelerInfoSummary.PriceRequestInformation.Items = new object[1] { nego };
request.TPA_Extensions = new OTA_AirLowFareSearchRQTPA_Extensions();
request.TPA_Extensions.IntelliSellTransaction = new TransactionType();
request.TPA_Extensions.IntelliSellTransaction.RequestType = new TransactionTypeRequestType();
request.TPA_Extensions.IntelliSellTransaction.RequestType.Name = "50ITIN";
}
public bool Execute()
{
response = service.BargainFinderMaxRQ(request);
return response.PricedItinCount > 0;
}
}
}
我的建议是,您应该添加基于 Sabre 模型构建的单独模型,并使整个结构扁平化。
例如,TravelItineraryReadRS
是一个相当复杂的文档。在程序中使用它的属性是一个真正的"痛苦",因为每次你需要记住通向特定信息的整个路径(例如,"姓名编号 01.01 的人名的乘客类型是什么?
我建议您使用专用模型(将其命名为Reservation
),其中包含您以后在应用程序中提取的所有信息,这些信息是从TravelItineraryReadRs
中提取的。 为了实现这一点,您需要一个专用的转换器,它将TravelRouteReadRs模型转换为预订模型。现在,在预订模型中,您可以拥有乘客模型列表,其中包含所有重要信息(姓名编号,乘客类型,SSR代码等)。
这提高了可读性,作为奖励,您可以将应用程序与 Sabre 分离(想象一下,有一天有人问"我们可以从 Sabre 切换到 Amadeus 吗?"——如果您使用专用模型,答案是"是"。如果你没有,那么答案是"可能是的,但需要 6-9 个月)。