2017-05-15 16 views
0

Das ist ziemlich allgemein, aber ich habe eine Menge Zeit herauszufinden, wie man einige der komplizierteren Sabre APIs konsumiert.Saber Web Services .NET API Beispiele, die nicht MVC sind?

Ich habe funktionierende .NET-Proxy-Klassen in C# mit der WSDL für die grundlegenden APIs (CreateSession, CloseSession) gebaut, aber für die komplizierteren APIs habe ich es wirklich schwer, das komplizierte XML-Schema zu analysieren, um herauszufinden, welche Methoden Ruf in meinem Programm an.

Gibt es andere .NET-Ressourcen/Beispiele, die nicht in MVC wie die code example that Sabre posted on GitHub verpackt sind?

Ich versuche herauszufinden, wie APIs wie OTA_AirPriceLLSRQ und TravelItineraryReadRQ zu verwenden.

Vielen Dank im Voraus für jede Hilfe!

+0

Es gibt keine anderen Quellen, zumindest von Sabre, die ich kenne. Wenn die MVC, auf die Sie sich beziehen, korrekt aufgebaut ist, sollten Sie sich nur auf die Modelle konzentrieren, da es im Controller fast keinen Code geben sollte und die Ansicht nur eine Ansicht sein sollte. Gibt es einen Service, mit dem Sie besondere Probleme haben? – Wisdoom

+0

Vielen Dank! Ich habe versucht, die angebotenen Modelle zu durchforsten, aber ich bin so verloren. So strukturieren sie den Code mit mehreren Schnittstellen und Service Factories ist mir nicht möglich. Ich bin auf der Suche nach einem sehr einfachen objektbasierten Ansatz, mit dem ich einen API-Aufruf instanziieren und dann seine Antwort konsumieren kann. Ich bin mir sicher, dass die Art und Weise, wie sie die MVC-App strukturiert haben, weitaus effizienter ist, aber für meinen Verstand ist es zu kompliziert. Ich habe das Gefühl, wenn ich ein paar Beispiele für den einfachen Ansatz finden könnte, konnte ich beginnen, die Proxy-Klassen genug zu verstehen, um meine eigenen Klassen für die meisten von Sabre offengelegten APIs zu implementieren. – drtrobridge

+0

Ich verstehe dich total, ich habe die gleiche Situation erlebt. Welchen Service versuchen Sie anzurufen? Ich könnte es haben und ich kann meine Klasse hier kopieren – Wisdoom

Antwort

0

Mein Rat ist, dass Sie separate Modelle hinzufügen sollten, die auf Sabre-Modellen basieren und die ganze Struktur abflachen.

Zum Beispiel ist TravelItineraryReadRS ein ziemlich kompliziertes Dokument. Die Verwendung von Eigenschaften in Ihrem Programm ist ein wahrer "Schmerz", da Sie sich jedes Mal an den gesamten Pfad erinnern müssen, der zu bestimmten Informationen führt (z. B. "Was ist der Passagiertyp für PersonName von NameNummer 01.01?").

Ich schlage vor, Sie haben gewidmetes Modell (nennen wir es Reservation), die alle Informationen haben, die Sie später in Ihrer Anwendung benötigen, extrahiert aus TravelItineraryReadRs. Um dies zu erreichen, benötigen Sie einen speziellen Konverter, der das TravelItineraryReadRs-Modell in das Reservierungsmodell konvertiert. Nun können Sie innerhalb des Reservierungsmodells eine Liste von Passagiermodellen haben, die alle wichtigen Informationen (NameNummer, Fahrgasttyp, SSR-Codes usw.) enthalten.

Dies verbessert die Lesbarkeit und als Bonus entkoppeln Sie Ihre Anwendung von Sabre (stellen Sie sich vor, eines Tages fragt jemand, ob wir von Sabre zu Amadeus wechseln können.) Habe nicht, dann lautet die Antwort "wahrscheinlich ja, aber es wird 6-9 Monate dauern".

+0

Danke für den Vorschlag - Ich habe tatsächlich eine ähnliche Menge von Objektmodellen erstellt, unabhängig von den Feldern, die Sabre durch das Aussortieren von nativem Sabre zurückgibt Antworten über die einfache 'SabreCommandLLSRQ' API. Mein größtes Problem ist jetzt, die Komplexität der in C# erstellten Proxy-Klassen zu verstehen und herauszufinden, wie diese Klassen verwendet werden, um eine Anfrage richtig zu formatieren und eine Antwort zu verarbeiten. Da die meisten der APIs, die ich konsumieren möchte, so kompliziert sind, kann ich anscheinend keine von ihnen zur Arbeit bringen (abgesehen von den einfachen wie 'CreateSession') – drtrobridge

1

Wie ich schon in den Kommentaren erwähnt habe, sollte man sich nicht auf das eigentliche MVC-Wrapping konzentrieren, da man hauptsächlich damit umgeht Sachen im Modell oder tatsächlich werden Sie diese woanders setzen und verbrauchen sie im Modell.

wie dem auch sei, nur für Sie als Beispiel zu haben, hier ist ein SEHR generic BFM (BargianFinderMax) cla s. Bei diesem Ansatz muss eine Instanz erstellt werden, und nach dem Aufruf der Execute-Methode wird die Antwort in der Instanz gespeichert.

Ich hoffe es hilft.

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; 
     } 
    } 

} 
+0

Das ist großartig! Das ist sehr hilfreich; Danke, dass du dir die Zeit genommen hast. Wenn Sie dieses Jahr bei TTX sein wollen, lassen Sie es mich wissen - ich werde Ihnen einen Cocktail oder sechs kaufen. – drtrobridge

+0

Ich war letztes Jahr dort, aber leider werde ich dieses Jahr nicht dabei sein, aber danke für das Gefühl! :) – Wisdoom