zoukankan      html  css  js  c++  java
  • 2.0通信之调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据

    介绍
    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;
            }

        }

    }



  • 相关阅读:
    Representation Data in OpenCascade BRep
    Render OpenCascade Geometry Surfaces in OpenSceneGraph
    Render OpenCascade Geometry Curves in OpenSceneGraph
    OpenCascade Shape Representation in OpenSceneGraph
    Geometry Surface of OpenCascade BRep
    Geometry Curve of OpenCascade BRep
    Tyvj2017清北冬令营入学测试
    Spfa算法模板
    洛谷1016 旅行家的预算
    洛谷1290 欧几里得的游戏
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1499153.html
Copyright © 2011-2022 走看看