博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据(转)
阅读量:7260 次
发布时间:2019-06-29

本文共 12814 字,大约阅读时间需要 42 分钟。

作者:
介绍
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(
1980
2
14) };
    }
    
/**/
///
 
<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(
1980
1
1) },
            
new User(){ Name = 
"
webabcd02
", DayOfBirth = 
new DateTime(
1980
2
2) },
            
new User(){ Name = 
"
webabcd03
", DayOfBirth = 
new DateTime(
1980
3
3) },
        };
    }
}
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(
1980
2
14) };
    }
    
/**/
///
 
<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(
1980
1
1) },
            
new User(){ Name = 
"
webabcd02
", DayOfBirth = 
new DateTime(
1980
2
2) },
            
new User(){ Name = 
"
webabcd03
", DayOfBirth = 
new DateTime(
1980
3
3) },
        };
    }
}
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;
        }
    }
}

转载于:https://www.cnblogs.com/arongbest/archive/2011/10/09/2203671.html

你可能感兴趣的文章
如何避免IPv6“友邻发现”威胁?
查看>>
探索阿里巴巴如何打造共享服务中台的稳定性——走进《企业IT架构转型之道》系列3...
查看>>
从大数据中“提炼”出商业见解,企业还有很多工作要做
查看>>
《并行计算的编程模型》一3.7.5 收集
查看>>
CA增强应用管理和监控的敏捷性 促进DevOps加快软件发布速度
查看>>
圆桌对话:新技术时代下IT管理的机遇
查看>>
云原生(Cloud Native)- 移动App研发新范式
查看>>
log4j2配置文件log4j2.xml解析
查看>>
我与云计算大会的三天
查看>>
高通发布两款物联网旗舰WiFi芯片
查看>>
绿盟科技Techworld 2017网络安全智能化 机器学习成亮点
查看>>
摩托罗拉系统完成对Kodiak Networks收购
查看>>
美国网络监听系统曝光:服务器遍布世界
查看>>
数据加密,国际软件标准,零封全球黑客,书生云20年庆典上的看点解密
查看>>
如何在Windows 10下轻松开启RS2 UWP版文件资源管理器
查看>>
100行C代码终端打印树形结构
查看>>
谈谈HPC可否掀起下一轮技术热潮
查看>>
JS属性特性(属性描述符)
查看>>
Java数组一定要初始化才能使用吗?
查看>>
精益求精的代码却被带漏洞组件毁于一旦
查看>>