#c# #webapi #shipping
#c# #webapi #Доставка
Вопрос:
Я пытаюсь протестировать API экспресс-перевозок Estes и столкнулся с проблемой. У меня настроен объект запроса (и я получаю ожидаемый ответ на ошибку), за исключением товарной части. Там wsdl не включает прямое соответствие, такое как товар, базовый товар или полные товары в их классе запроса, а просто указывает элемент в качестве типа объекта.
``` [System.Xml.Serialization.XmlElementAttribute("baseCommodities", typeof(BaseCommoditiesType))] [System.Xml.Serialization.XmlElementAttribute("fullCommodities", typeof(FullCommoditiesType))] public object Item { get { return this.itemField; } set { this.itemField = value; } } [System.Xml.Serialization.XmlElement("commodity", typeof(FullCommodityType))]//added to request class recently public object Items { get { return this.itemsField; } set { this.itemsField = value; } } ```
Вот мой код до сих пор. Я попробовал несколько вещей, которые заканчиваются тем, что не был создан xml-документ. Я не понимаю, как добавить товар и полные товарные позиции в объект запроса. Теперь, когда я взломал, все, что мне нужно сделать, это обернуть элемент «Товары» вокруг элемента «товар». Это мой единственный вопрос сейчас.
static void Main(string[] args) { RateQuoteService service = new RateQuoteService() ; AuthenticationType authentication = new AuthenticationType(); authentication.user = "xxxxxxxx"; authentication.password = "xxxxxx"; service.auth = authentication; rateRequest request = new rateRequest(); rateQuote quote = new rateQuote(); request.requestID = generateID();//just guid value for now request.account = "xxxxxxx"; PointType origin = new PointType(); origin.city = "Shelby TownShip"; origin.postalCode = "48315"; origin.stateProvince = "MI"; origin.countryCode = "US"; request.originPoint = origin; PointType destination = new PointType(); destination.city = "Fenton"; destination.postalCode = "48430"; destination.stateProvince = "MI"; destination.countryCode = "US"; request.destinationPoint = destination; request.payor = "S"; request.terms = "P"; PickupType pickUP = new PickupType(); request.pickup = pickUP; request.declaredValue = 1000.00M; request.declaredValueSpecified = true; request.stackable = YesNoBlankType.N;//enum request.stackableSpecified = true; request.linearFeet = "80"; request.foodWarehouse = "other"; request.declaredValueWaived = YesNoBlankType.N;//enum request.declaredValueWaivedSpecified = true; FullCommoditiesType fcom = new FullCommoditiesType();//just commodity property FullCommodityType fcomtypes = new FullCommodityType();//all other properties DimensionsType dim = new DimensionsType(); dim.length = "75"; dim.width = "50"; dim.height = "25"; fcomtypes.@class = 70.0M; fcomtypes.weight = "500"; fcomtypes.pieces = "2"; fcomtypes.pieceType = PackagingType.PT; fcomtypes.classSpecified = true; fcomtypes.dimensions = dim; //fcom.commodity = ???? //request.Item = ????//I'm assuming fcomtypes but dosent work request.Items = fcomtypes; //Hack - Now this adds what I need to the request object //request.Item = fcomtypes as FullCommodityType;//dont work either quote = service.getQuote(request); }
XML generated:
lt;?xml version="1.0" encoding="utf-8"?gt; lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"gt; lt;soap:Headergt; lt;auth xmlns="http://ws.estesexpress.com/ratequote"gt; lt;usergt;xxxxxxlt;/usergt; lt;passwordgt;xxxxxxxxlt;/passwordgt; lt;/authgt; lt;/soap:Headergt; lt;soap:Bodygt; lt;rateRequest xmlns="http://ws.estesexpress.com/schema/2019/01/ratequote"gt; lt;requestIDgt;5fdbdbeedf474a439a54559750c2c5ealt;/requestIDgt; lt;accountgt;xxxxxxxlt;/accountgt; lt;originPointgt; lt;countryCodegt;USlt;/countryCodegt; lt;postalCodegt;48315lt;/postalCodegt; lt;citygt;Shelby TownShiplt;/citygt; lt;stateProvincegt;MIlt;/stateProvincegt; lt;/originPointgt; lt;destinationPointgt; lt;countryCodegt;USlt;/countryCodegt; lt;postalCodegt;48430lt;/postalCodegt; lt;citygt;Fentonlt;/citygt; lt;stateProvincegt;MIlt;/stateProvincegt; lt;/destinationPointgt; lt;payorgt;Slt;/payorgt; lt;termsgt;Plt;/termsgt; lt;pickupgt; lt;dategt;0001-01-01lt;/dategt; lt;/pickupgt; lt;declaredValuegt;1000.00lt;/declaredValuegt; lt;declaredValueWaivedgt;Nlt;/declaredValueWaivedgt; lt;stackablegt;Nlt;/stackablegt; lt;linearFeetgt;80lt;/linearFeetgt; lt;foodWarehousegt;otherlt;/foodWarehousegt; lt;commoditygt; lt;classgt;70.0lt;/classgt; lt;weightgt;500lt;/weightgt; lt;piecesgt;2lt;/piecesgt; lt;pieceTypegt;PTlt;/pieceTypegt; lt;dimensionsgt; lt;lengthgt;75lt;/lengthgt; lt;widthgt;50lt;/widthgt; lt;heightgt;25lt;/heightgt; lt;/dimensionsgt; lt;descriptiongt;testlt;/descriptiongt; lt;/commoditygt; lt;/rateRequestgt; lt;/soap:Bodygt; lt;/soap:Envelopegt;
Ожидаемый Возврат Неисправности:
lt;?xml version='1.0' encoding='utf-8'?gt; lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"gt; lt;soapenv:Header/gt; lt;soapenv:Bodygt; lt;soapenv:Faultgt; lt;faultcodegt;soapenv:Serverlt;/faultcodegt; lt;faultstringgt;Schema validation errorlt;/faultstringgt; lt;detailgt; lt;rat:schemaError xmlns:rat="http://ws.estesexpress.com/ratequote"gt; lt;rat:errorgt;Expected elements 'baseCommodities@http://ws.estesexpress.com/schema/2019/01/ratequote fullCommodities@http://ws.estesexpress.com/schema/2019/01/ratequote' before the end of the content in element rateRequest@http://ws.estesexpress.com/schema/2019/01/ratequotelt;/rat:errorgt; lt;rat:errorgt;Expected elements 'baseCommodities@http://ws.estesexpress.com/schema/2019/01/ratequote fullCommodities@http://ws.estesexpress.com/schema/2019/01/ratequote' instead of 'commodity@http://ws.estesexpress.com/schema/2019/01/ratequote' here in element rateRequest@http://ws.estesexpress.com/schema/2019/01/ratequotelt;/rat:errorgt; lt;/rat:schemaErrorgt; lt;/detailgt; lt;/soapenv:Faultgt; lt;/soapenv:Bodygt; lt;/soapenv:Envelopegt;
Ответ №1:
Я бы создал такой список, как:
Listlt;FullCommodityTypegt; productDesc = new Listlt;FullCommodityTypegt;(); productDesc.Add(new FullCommodityType() { @class = 70, classSpecified = true, weight = "500", pieces = "2", pieceType = PackagingType.PT, dimensions = dim }); Listlt;FullCommoditiesTypegt; products = new Listlt;FullCommoditiesTypegt;(); products.Add(new FullCommoditiesType() { commodity = productDesc.ToArray() }); request.Item = products[0];
И вам, вероятно, следует добавить дату получения, иначе вы получите неизвестную ошибку.