• 稳扎稳打Silverlight(19) 2.0通信之调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据


    [索引页]
    [源码下载]


    稳扎稳打Silverlight(19) - 2.0通信之调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据


    作者:webabcd


    介绍
    Silverlight 2.0 调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据
        通过 System.Net.WebClient 类调用 REST 服务
        通过 System.Json 命名控件下的类处理 JSON 数据
        通过 System.Xml.Linq 命名空间下的类(LINQ to XML)处理 XML 数据
        通过 System.ServiceModel.Syndication 命名空间下的类处理 RSS/ATOM 数据


    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


    示例
    1、调用 REST 服务,返回 JSON 数据
    REST.cs(WCF创建的REST服务)
    using System;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Activation;

    using System.ServiceModel.Web;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    /// <summary>
    /// 提供 REST 服务的类
    /// 注:Silverlight只支持 GET 和 POST
    /// </summary>

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode 
    = AspNetCompatibilityRequirementsMode.Allowed)]
    public class REST
    {
        
    /// <summary>
        
    /// 用于演示返回 JSON(对象) 的 REST 服务
        
    /// </summary>
        
    /// <param name="name"></param>
        
    /// <returns></returns>

        [OperationContract]
        [WebGet(UriTemplate 
    = "User/{name}/json", ResponseFormat = WebMessageFormat.Json)]
        
    public User HelloJson(string name)
        
    {
            
    return new User { Name = name, DayOfBirth = new DateTime(1980214) };
        }


        
    /// <summary>
        
    /// 用于演示返回 JSON(集合) 的 REST 服务
        
    /// </summary>
        
    /// <returns></returns>

        [OperationContract]
        [WebGet(UriTemplate 
    = "Users/json", ResponseFormat = WebMessageFormat.Json)]
        
    public List<User> HelloJson2()
        
    {
            
    return new List<User> 
            

                
    new User(){ Name = "webabcd01", DayOfBirth = new DateTime(198011) },
                
    new User(){ Name = "webabcd02", DayOfBirth = new DateTime(198022) },
                
    new User(){ Name = "webabcd03", DayOfBirth = new DateTime(198033) },
            }
    ;
        }

    }


    Json.xaml
    <UserControl x:Class="Silverlight20.Communication.Json"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml">
        
    <StackPanel HorizontalAlignment="Left" Width="600">
        
            
    <TextBox x:Name="txtMsgJson" Margin="5" />
            
    <TextBox x:Name="txtMsgJson2" Margin="5" /> 
            
        
    </StackPanel>
    </UserControl>

    Json.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    using System.IO;

    namespace Silverlight20.Communication
    {
        
    public partial class Json : UserControl
        
    {
            
    public Json()
            
    {
                InitializeComponent();

                
    // 演示如何处理 JSON(对象)
                JsonDemo();

                
    // 演示如何处理 JSON(集合)
                JsonDemo2();
            }


            
    /// <summary>
            
    /// 演示如何处理 JSON(对象)
            
    /// </summary>

            void JsonDemo()
            
    {
                
    // REST 服务的 URL
                Uri uri = new Uri("http://localhost:3036/REST.svc/User/webabcd/json", UriKind.Absolute);

                
    // 实例化 WebClient
                System.Net.WebClient client = new System.Net.WebClient();

                client.DownloadStringCompleted 
    += new DownloadStringCompletedEventHandler(json_DownloadStringCompleted);
                client.DownloadStringAsync(uri);

                txtMsgJson.Text 
    = "读取 JSON(对象) 数据中。。。";
            }


            
    void json_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            
    {
                
    if (e.Error != null)
                
    {
                    
    // 发生错误的话,则打印出来
                    txtMsgJson.Text = e.Error.ToString();
                    
    return;
                }


                
    // 将获得的字符串转换为 JSON(对象)
                var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
                var ms 
    = new MemoryStream(buffer);
                var jsonObject 
    = System.Json.JsonObject.Load(ms) as System.Json.JsonObject;

                txtMsgJson.Text 
    = e.Result + "\r\n";
                
    // 解析 JSON(对象)
                txtMsgJson.Text += string.Format("姓名: {0}, 生日: {1}",
                    (
    string)jsonObject["Name"],
                    ((DateTime)jsonObject[
    "DayOfBirth"]).ToString("yyyy-MM-dd"));

                
    /* 
                 * 总结:
                 * JsonObject - 一个具有零或多个 key-value 对的无序集合。继承自抽象类 JsonValue
                 *     JsonObject.Load(Stream) - 将指定的字符串流反序列化为 JSON 对象(CLR可用的类型)
                 *     JsonObject[key] - JsonObject 索引器,获取 JsonObject 的指定key的value
                 *     JsonObject.ContainsKey(key) - JsonObject 对象内是否具有指定的key
                 
    */

            }


            
    /// <summary>
            
    /// 演示如何处理 JSON(集合)
            
    /// </summary>

            void JsonDemo2()
            
    {
                
    // REST 服务的 URL
                Uri uri = new Uri("http://localhost:3036/REST.svc/Users/json", UriKind.Absolute);

                
    // 实例化 WebClient
                System.Net.WebClient client = new System.Net.WebClient();

                client.DownloadStringCompleted 
    += new DownloadStringCompletedEventHandler(json2_DownloadStringCompleted);
                client.DownloadStringAsync(uri);

                txtMsgJson2.Text 
    = "读取 JSON(集合) 数据中。。。";
            }


            
    void json2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            
    {
                
    if (e.Error != null)
                
    {
                    
    // 发生错误的话,则打印出来
                    txtMsgJson2.Text = e.Error.ToString();
                    
    return;
                }


                
    // 将获得的字符串转换为 JSON(集合)
                var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
                var ms 
    = new MemoryStream(buffer);
                var jsonArray 
    = System.Json.JsonArray.Load(ms) as System.Json.JsonArray;

                txtMsgJson2.Text 
    = e.Result + "\r\n";
                txtMsgJson2.Text 
    += string.Format("姓名: {0}, 生日: {1}",
                    (
    string)jsonArray.First()["Name"],
                    ((DateTime)jsonArray.Single(p 
    => p["Name"== "webabcd02")["DayOfBirth"]).ToString("yyyy-MM-dd"));

                
    /* 
                 * 总结:
                 * JsonArray - 一个具有零或多个 JsonValue(抽象类,JsonObject和JsonArray都继承自此类) 对象的有序序列
                 *     JsonArray.Load(Stream) - 将指定的字符串流反序列化为 JSON 对象(CLR可用的类型)
                 *     JsonArray[index] - JsonArray 索引器,获取 JsonArray 的指定索引的 JsonValue
                 *     JsonArray 支持 LINQ
                 
    */

            }

        }

    }



    2、调用 REST 服务,返回 XML 数据
    REST.cs(WCF创建的REST服务)
    using System;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Activation;

    using System.ServiceModel.Web;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;

    /// <summary>
    /// 提供 REST 服务的类
    /// 注:Silverlight只支持 GET 和 POST
    /// </summary>

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode 
    = AspNetCompatibilityRequirementsMode.Allowed)]
    public class REST
    {
        
    /// <summary>
        
    /// 用于演示返回 XML(对象) 的 REST 服务
        
    /// </summary>
        
    /// <param name="name"></param>
        
    /// <returns></returns>

        [OperationContract]
        [WebGet(UriTemplate 
    = "User/{name}/xml", ResponseFormat = WebMessageFormat.Xml)]
        
    public User HelloXml(string name)
        
    {
            
    return new User { Name = name, DayOfBirth = new DateTime(1980214) };
        }


        
    /// <summary>
        
    /// 用于演示返回 XML(集合) 的 REST 服务
        
    /// </summary>
        
    /// <returns></returns>

        [OperationContract]
        [WebGet(UriTemplate 
    = "Users/xml", ResponseFormat = WebMessageFormat.Xml)]
        
    public List<User> HelloXml2()
        
    {
            
    return new List<User> 
            

                
    new User(){ Name = "webabcd01", DayOfBirth = new DateTime(198011) },
                
    new User(){ Name = "webabcd02", DayOfBirth = new DateTime(198022) },
                
    new User(){ Name = "webabcd03", DayOfBirth = new DateTime(198033) },
            }
    ;
        }

    }


    Xml.xaml
    <UserControl x:Class="Silverlight20.Communication.Xml"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml">
        
    <StackPanel HorizontalAlignment="Left" Width="600">

            
    <TextBox x:Name="txtMsgXml" Margin="5" />
            
    <TextBox x:Name="txtMsgXml2" Margin="5" />

        
    </StackPanel>
    </UserControl>

    Xml.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    using System.Xml.Linq;
    using System.IO;

    namespace Silverlight20.Communication
    {
        
    public partial class Xml : UserControl
        
    {
            
    public Xml()
            
    {
                InitializeComponent();

                
    // 演示如何处理 XML(对象)
                XmlDemo();

                
    // 演示如何处理 XML(集合)
                XmlDemo2();
            }


            
    /// <summary>
            
    /// 演示如何处理 XML(对象)
            
    /// </summary>

            void XmlDemo()
            
    {
                
    // REST 服务的 URL
                Uri uri = new Uri("http://localhost:3036/REST.svc/User/webabcd/xml", UriKind.Absolute);

                
    // 实例化 WebClient
                System.Net.WebClient client = new System.Net.WebClient();

                client.DownloadStringCompleted 
    += new DownloadStringCompletedEventHandler(xml_DownloadStringCompleted);
                client.DownloadStringAsync(uri);

                txtMsgXml.Text 
    = "读取 XML(对象) 数据中。。。";
            }


            
    void xml_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            
    {
                
    if (e.Error != null)
                
    {
                    
    // 发生错误的话,则打印出来
                    txtMsgXml.Text = e.Error.ToString();
                    
    return;
                }


                
    // 将获得的字符串转换为 XML(对象)
                var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
                var ms 
    = new MemoryStream(buffer);

                XElement xmlObject 
    = XElement.Load(ms);

                txtMsgXml.Text 
    = e.Result + "\r\n";
                XNamespace ns 
    = "http://webabcd.cnblogs.com/";
                txtMsgXml.Text 
    += string.Format("姓名: {0}, 生日: {1}",
                    (
    string)xmlObject.Element(ns + "Name"),
                    ((DateTime)xmlObject.Element(ns 
    + "DayOfBirth")).ToString("yyyy-MM-dd"));

                
    /* 
                 * 总结:
                 * XElement - 表示一个 XML 元素
                 *     XElement.Element - XML 元素内的 XML 元素
                 *     XElement.Attribute - XML 元素内的 XML 属性
                 *     XElement.Load(Stream) - 使用指定流创建一个 XElement 对象
                 *     XElement.Parse(String) - 解析指定的 XML 字符串为一个 XElement 对象
                 * XAttribute - 表示一个 XML 属性
                 
    */

            }


            
    /// <summary>
            
    /// 演示如何处理 XML(集合)
            
    /// </summary>

            void XmlDemo2()
            
    {
                
    // REST 服务的 URL
                Uri uri = new Uri("http://localhost:3036/REST.svc/Users/xml", UriKind.Absolute);

                
    // 实例化 WebClient
                System.Net.WebClient client = new System.Net.WebClient();

                client.DownloadStringCompleted 
    += new DownloadStringCompletedEventHandler(xml2_DownloadStringCompleted);
                client.DownloadStringAsync(uri);

                txtMsgXml2.Text 
    = "读取 XML(集合) 数据中。。。";
            }


            
    void xml2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            
    {
                
    if (e.Error != null)
                
    {
                    
    // 发生错误的话,则打印出来
                    txtMsgXml2.Text = e.Error.ToString();
                    
    return;
                }


                
    // 将获得的字符串转换为 XML(集合)
                XDocument xmlObject = XDocument.Parse(e.Result);

                txtMsgXml2.Text 
    = e.Result + "\r\n";
                XNamespace ns 
    = "http://webabcd.cnblogs.com/";
                var obj 
    = from p in xmlObject.Elements(ns + "ArrayOfUser").Elements(ns + "User")
                          
    where p.Element(ns + "Name").Value == "webabcd02"
                          select 
    new { Name = (string)p.Element(ns + "Name"), DayOfBirth = (DateTime)p.Element(ns + "DayOfBirth") };
                
                txtMsgXml2.Text 
    += string.Format("姓名: {0}, 生日: {1}",
                    obj.First().Name,
                    obj.First().DayOfBirth.ToString(
    "yyyy-MM-dd"));


                
    /* 
                 * 总结:
                 * LINQ to XML 相当的方便
                 
    */

            }

        }

    }



    3、调用 REST 服务,返回 Rss/Atom 数据
    Proxy.aspx.cs(返回指定的url地址的内容的服务)
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    public partial class Proxy : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    // 获取某个 url 地址的 html 并在页面上输出

            
    string url = Request.QueryString["url"];

            System.Net.WebClient client 
    = new System.Net.WebClient();
            client.Encoding 
    = System.Text.Encoding.UTF8;

            Response.Write(client.DownloadString(url));
            Response.End();
        }

    }


    RssAtom.xaml
    <UserControl x:Class="Silverlight20.Communication.RssAtom"
        xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml">
        
    <StackPanel HorizontalAlignment="Left" >

            
    <TextBox x:Name="txtMsgRss" Width="600" Margin="5" />

            
    <StackPanel Orientation="Horizontal">
            
                
    <ListBox x:Name="list" Width="300" Margin="5" SelectionChanged="list_SelectionChanged">
                    
    <ListBox.ItemTemplate>
                        
    <DataTemplate>
                            
    <TextBlock Text="{Binding Title.Text}"></TextBlock>
                        
    </DataTemplate>
                    
    </ListBox.ItemTemplate>
                
    </ListBox>

                
    <TextBlock x:Name="detail" Width="300" Margin="5" Text="{Binding Summary.Text}" TextWrapping="Wrap" />
                
            
    </StackPanel>
            
        
    </StackPanel>
    </UserControl>

    RssAtom.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    using System.Xml;
    using System.IO;
    using System.ServiceModel.Syndication;

    namespace Silverlight20.Communication
    {
        
    public partial class RssAtom : UserControl
        
    {
            
    public RssAtom()
            
    {
                InitializeComponent();

                
    // 演示如何处理 Rss/Atom
                RssDemo();
            }


            
    /// <summary>
            
    /// 演示如何处理 Rss/Atom
            
    /// </summary>

            void RssDemo()
            
    {
                
    // 让一个代理页面去请求相关的 Rss/Atom(如果用Silverlight直接去请求,则需要在目标域的根目录下配置策略文件)
                Uri uri = new Uri("http://localhost:3036/Proxy.aspx?url=http://webabcd.cnblogs.com/rss", UriKind.Absolute);

                
    // 实例化 WebClient
                System.Net.WebClient client = new System.Net.WebClient();

                client.DownloadStringCompleted 
    += new DownloadStringCompletedEventHandler(rss_DownloadStringCompleted);
                client.DownloadStringAsync(uri);

                txtMsgRss.Text 
    = "读取 RSS 数据中。。。";
            }


            
    void rss_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            
    {
                
    if (e.Error != null)
                
    {
                    
    // 发生错误的话,则打印出来
                    txtMsgRss.Text = e.Error.ToString();
                    
    return;
                }


                
    // 将获得的字符串转换为 XmlReader
                var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result);
                var ms 
    = new MemoryStream(buffer);
                XmlReader reader 
    = XmlReader.Create(ms);

                
    // 从指定的 XmlReader 中加载,以生成 SyndicationFeed
                SyndicationFeed feed = SyndicationFeed.Load(reader);

                
    // 设置 list 的数据源为 Rss/Atom 的项集合(SyndicationFeed.Items)
                list.ItemsSource = feed.Items;
                txtMsgRss.Text 
    = e.Result + "\r\n";
            }


            
    private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
            
    {
                
    // 设置 detail 的数据上下文为 Rss/Atom 的指定项(SyndicationItem)
                detail.DataContext = list.SelectedItem as SyndicationItem;
            }

        }

    }



    OK
    [源码下载]
  • 相关阅读:
    17.CSS 文本属性和字体属性
    15.CSS 浮动
    D. Same GCDs
    B. Infinite Prefixes
    D. 0-1 MST
    lambda表达式复习
    D. New Year and Conference
    C. New Year and Permutation
    D. Dr. Evil Underscores
    D. Minimax Problem
  • 原文地址:https://www.cnblogs.com/webabcd/p/1347209.html
Copyright © 2020-2023  润新知