Estes Express v4.0 Rate Quote API商品节点封装校验错误咨询
问题解决步骤
核心错误原因
- 你不需要手动新增
Items属性,WSDL自动生成的Item属性本身已经适配baseCommodities/fullCommodities节点的序列化规则 - 你新增的
Items属性绑定了commodity节点,导致commodity直接暴露在rateRequest下,不符合接口Schema要求
修改方案
第一步:还原请求类定义
删除你手动新增的Items属性,保留WSDL自动生成的Item属性即可:
// 仅保留WSDL生成的原始Item属性,删除你加的Items属性 [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; } }
第二步:修改测试代码赋值逻辑
FullCommoditiesType类本身会自带存储commodity节点的属性(通常是名为commodity的数组/集合类型),按以下逻辑赋值即可:
// 原有创建fcom、fcomtypes、dim的代码不变 FullCommoditiesType fcom = new FullCommoditiesType(); FullCommodityType fcomtypes = new FullCommodityType(); 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; fcomtypes.description = "test"; // 补全你遗漏的描述字段 // 给FullCommoditiesType的commodity属性赋值,支持传多个商品 fcom.commodity = new FullCommodityType[] { fcomtypes }; // 把fullCommodities对象赋值给原始的Item属性 request.Item = fcom; // 删除你之前加的request.Items = fcomtypes; 这行代码 // 后续调用接口的代码不变 quote = service.getQuote(request);
生成的正确请求结构
修改后rateRequest下的商品节点会符合Schema要求:
<fullCommodities> <commodity> <class>70.0</class> <weight>500</weight> <pieces>2</pieces> <pieceType>PT</pieceType> <dimensions> <length>75</length> <width>50</width> <height>25</height> </dimensions> <description>test</description> </commodity> </fullCommodities>
内容的提问来源于stack exchange,提问作者duerzd696
相关产品推荐
相关产品推荐

