zoukankan      html  css  js  c++  java
  • dynamic解析Http xml格式响应数据

    继续上一篇 构建RESTful风格的WCF服务 ,咱已经把服务端的数据和服务准备好了,客户端调用 wcf rest接口后如何解析xml?下面使用dynamic关键字解析来至于WCF REST XML响应数据。

    首先创建一个WCF客户端类,添加GET、POST处理方法:

      public class WcfRestClient
        {
            public Uri BaseUri { get; private set; } //Url:http://localhost:1008/
    
    
            public WcfRestClient(Uri baseUri)
            {
                BaseUri = baseUri;
            }
    
            public WcfRestClient(string baseUrl)
                : this(new Uri(baseUrl))
            {
     
            }
    
            private dynamic GetResponseObject(HttpWebRequest request)
            {
                try
                {
                    var response = request.GetResponse() as HttpWebResponse;
                    using (var stream = response.GetResponseStream())
                    {
                        if (!stream.CanRead)
                            return null;
                        StreamReader reader = new StreamReader(stream);
                        string source = reader.ReadToEnd();
                        response.Close();
                        return XmlStringToDynamic(source);
                    }
                }
                catch (WebException ex)
                {
                    using (var stream = ex.Response.GetResponseStream())
                    {
                        if (!stream.CanRead)
                            return null;
                        StreamReader reader = new StreamReader(stream);
                        string source = reader.ReadToEnd();
                        return XmlStringToDynamic(source);
                    }
                }
            }
    
        //GET请求
    public dynamic WebGet(string path) { HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(BaseUri.ToString()+path); return GetResponseObject(request); }
        //POST请求
    public dynamic WebPost(string path, string data) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(BaseUri.ToString() + path); request.Method = "POST"; if (!String.IsNullOrEmpty(data)) { request.ContentType = "text/xml"; //xml格式传输数据 byte[] buffer = Encoding.UTF8.GetBytes(data); request.ContentLength = buffer.Length; using (var stream = request.GetRequestStream()) { stream.Write(buffer, 0, buffer.Length); stream.Flush(); } } return GetResponseObject(request); }
             //
    public static dynamic XmlStringToDynamic(string xml) { if (String.IsNullOrEmpty(xml)) return null; XElement element = XElement.Parse(xml); dynamic dynamicResult = new DynamicXMLNode(element); return dynamicResult; }
    
    
    
    
        }

    2、dynamic处理xml节点DynamicXMLNode类,需要继承DynamicObject(System.Dynamic),对返回的xml对象进行动态解析。

      public class DynamicXMLNode:DynamicObject
        {
            public DynamicXMLNode() { }
            
            XElement node;
    
            public XElement Element
            {
                get
                {
                    return node;
                }
            }
    
            public DynamicXMLNode(XElement node)
            {
                this.node = node;
            }
    
            public DynamicXMLNode(string name)
            {
                node = new XElement(name);
            }
    
            public override bool TryGetMember(GetMemberBinder binder, out object result)
            {
                if (binder.Name == "Value")
                {
                    result = node.Value;
                    return true;
                }
                if (binder.Name == "ElementCount")
                {
                    if (node.HasElements)
                        result = node.Elements().Count();
                    else
                        result = 0;
                    return true;
                }
                XElement getNode;
                try
                {
                    getNode = node.Element(binder.Name);
                }
                catch
                {
                    result = null;
                    return true;
                }
                if (getNode != null)
                {
                    result = new DynamicXMLNode(getNode);
                    return true;
                }
                else
                {
                    result = null;
                    return false;
                }
            }
    
    
        }

    3、最后咱们来测试一下发起GET和POST请求,首先创建一个aspx页面,在.cs文件:

     /// <summary>
            /// 处理GET请求
            /// </summary>
            private void GetData()
            {
                WcfRestClient client = new WcfRestClient("http://localhost:1008/");
                dynamic result = client.WebGet(String.Format("user/search/{0}", "600000"));
                this.txtGetUrl.Text = client.BaseUri + String.Format("user/search/{0}", "600000");
                this.txtId.Text = result.Id.Value;
                this.txtCode.Text = result.Code.Value;
                this.txtName.Text = result.Name.Value;
                this.txtDesc.Text = result.Description.Value;
            }
    
    
            /// <summary>
            /// 测试POST请求
            /// </summary>
            private void PostData()
            {
                string strBuiler = String.Format("<UserInfo><Code>{0}</Code><Description>{1}</Description><Id>{2}</Id><Name>{3}</Name></UserInfo>","90000","post请求",1000,"好基友");
                WcfRestClient client = new WcfRestClient("http://localhost:1008/");
                dynamic result = client.WebPost("user/register", strBuiler);
                this.txtPOSTUrl.Text = client.BaseUri + "user/register";
                this.txtId1.Text = result.Id.Value;
                this.txtCode1.Text = result.Code.Value;
                this.txtName1.Text = result.Name.Value;
                this.txtDesc1.Text = result.Description.Value;
            }

    测试结果:

    噢了。。。

  • 相关阅读:
    自动刷新页面
    docker 数据卷管理
    docker container(容器)
    docker images
    docker 设计原理
    hbase数据原理及基本架构
    详谈kafka的深入浅出
    django介绍及路由系统
    mysql爱之深探测
    mysql数据库内容相关操作
  • 原文地址:https://www.cnblogs.com/KingLei/p/3209016.html
Copyright © 2011-2022 走看看