调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据(转)

时间:2022-09-15 12:32:34
作者: 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 数据

示例
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;
        }
    }
}