C#构建XML-RPC请求时复杂结构体与数组的构造问题及解决方法
C#构建XML-RPC请求时复杂结构体与数组的构造问题及解决方法
最近帮朋友排查过类似的XML-RPC参数构造问题,看到你踩的坑特别熟悉,结合你提供的尝试过程和最终找到的解决方案,整理一下具体的问题原因和正确处理方式:
问题场景
你需要调用XML-RPC接口update_plan_prices,其中第五个参数要求是一个带成员的struct结构:成员的name是房间ID,对应的值是一个包含价格数据的数组。你尝试了两种构造方式都报错:
- 第一种用匿名对象数组:返回「no prices found」,说明接口没正确识别到价格数据,参数结构不符合预期
- 第二种用匿名对象:返回「Tried to change more than 1000 nights」,说明参数被解析成了错误格式,导致天数计算异常
问题根源
XML-RPC的struct和array是专用类型,普通C#匿名对象/数组没法被XML-RPC代理正确序列化为目标XML结构,自然会被接口拒绝或者解析出错。
正确解决方案
要使用XML-RPC库提供的XmlRpcStruct类型来构建参数,才能生成符合接口要求的XML:
调整方法定义
先把update_plan_prices方法的最后一个参数类型改为XmlRpcStruct,确保代理能正确识别并序列化这个类型:Object[] update_plan_prices(string token, string lcode, int pid, string dfrom, XmlRpcStruct prices);构造正确的参数结构
用XmlRpcStruct来构建包含房间ID和对应价格数组的结构体,键是房间ID(字符串类型),值是价格数据数组:// 初始化XmlRpcStruct对象 XmlRpcStruct pricesObj = new XmlRpcStruct(); // 添加房间ID与对应的价格数组(示例中房间ID为"559769",价格为201) pricesObj.Add("559769", new object[] { 201 });发起请求
用构造好的pricesObj作为参数调用接口,此时生成的XML会和接口要求的结构完全匹配:FlRPC proxy = XmlRpcProxyGen.Create<FlRPC>(); var responses = proxy.update_plan_prices("RandToken", "1234234", 0, "10/10/2017", pricesObj);
验证生成的XML结构
这样构造后,生成的第五个参数XML会和接口要求的完全一致:
<param> <value> <struct> <member> <name>559769</name> <value> <array> <data> <value> <int>201</int> </value> </data> </array> </value> </member> </struct> </value> </param>
这个结构能被接口正确解析,不会再出现之前的错误。
备注:内容来源于stack exchange,提问作者pleasehelpstackover
相关产品推荐
相关产品推荐

