zoukankan      html  css  js  c++  java
  • XmlRpc.net 入参结构体嵌套的转义操作

    项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net。

    普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析。抓包数据如下:

    <?xml version="1.0" encoding="utf-8"?>
    <methodCall>
      <methodName>add</methodName>
      <params>
        <param>
          <value>
            <struct>
              <member>
                <name>time</name>
                <value>
                  <i4>1371571200</i4>
                </value>
              </member>
              <member>
                <name>args</name>
                <value>
                  <struct>
                    <member>
                      <name>sites</name>
                      <value>
                        <i4>1</i4>
                      </value>
                    </member>
                  </struct>
                </value>
              </member>
            </struct>
          </value>
        </param>
      </params>
    </methodCall>

    和服务器端同事讨论之后得知服务器端不支持结构体嵌套,需要把 args 结构体转成字符串发过去。
    代码如下:

    XmlRpcStruct argParam = new XmlRpcStruct();
    …… // 给 argParam 赋值
    XmlRpcSerializer serial = new XmlRpcSerializer(); // XmlRpc 自带的序列化类
    string arg = null;
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriter xtw = XmlWriter.Create(ms);
        serial.Serialize(xtw, argParam, new MappingActions());
        xtw.Flush();
        xtw.Close();
    
        arg = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        arg = arg.Replace("<?xml version="1.0" encoding="utf-8"?>", "");
    }
    
    xmlParam["args"] = arg;

    经过测试服务器端可以获取到 args 入参。抓包数据如下:

    <?xml version="1.0" encoding="utf-8"?>
    <methodCall>
      <methodName>add</methodName>
      <params>
        <param>
          <value>
            <struct>
              <member>
                <name>time</name>
                <value>
                  <i4>1371571200</i4>
                </value>
              </member>
              <member>
                <name>args</name>
                <value>&lt;value&gt;&lt;struct&gt;&lt;member&gt;&lt;name&gt;sites&lt;/name&gt;&lt;value&gt;&lt;i4&gt;1&lt;/i4&gt;&lt;/value&gt;&lt;/member&gt;&lt;/struct&gt;&lt;/value&gt;</value>
              </member>
            </struct>
          </value>
        </param>
      </params>
    </methodCall>

    补充一点:
    args 参数以字符串方式赋值默认会有一个<string>……</string>标记。抓包如下:

    <?xml version="1.0" encoding="utf-8"?>
    <methodCall>
      <methodName>add</methodName>
      <params>
        <param>
          <value>
            <struct>
              <member>
                <name>time</name>
                <value>
                  <i4>1371571200</i4>
                </value>
              </member>
              <member>
                <name>args</name>
                <value>
                  <string>&lt;value&gt;&lt;struct&gt;&lt;member&gt;&lt;name&gt;sites&lt;/name&gt;&lt;value&gt;&lt;i4&gt;1&lt;/i4&gt;&lt;/value&gt;&lt;/member&gt;&lt;/struct&gt;&lt;/value&gt;</string>
                </value>
              </member>
            </struct>
          </value>
        </param>
      </params>
    </methodCall>

    希望不显示<string>……</string>标记则需要设置 UseStringTag 属性为 False :

    proxyClient = XmlRpcProxyGen.Create<IXmlRpcClient>();
    proxyClient.UseStringTag = false;
  • 相关阅读:
    网络多线程 ---实现网络负载图片
    optimizer for eclipse--Eclipse优化,让你的Eclipse快来飞!
    ORACLE AUTOMATIC STORAGE MANAGEMENT翻译-第二章 ASM instance(1)
    IOS 开展 分别制定了iphone 和 ipad 好? 或开发一个 Universal好?
    DevExpress VCL 2014.1.2 for C++BUILDER XE6
    swift http请求返回json数据和分析
    Spark里面的任务调度:离SparkContext开始
    ftk学习记录(一个进度条文章)
    Appium Android Bootstrap控制源代码的分析AndroidElement
    别忽视了业绩比较基准
  • 原文地址:https://www.cnblogs.com/dipwater/p/3143826.html
Copyright © 2011-2022 走看看