WCF完美搭建android平台服务之二
其实可以看到我们我们是通过Json和XML的扩平台性实现的wcf服务的可用性,既然Json和XML同样在IOS平台下使用,当然为了实现数据应用该模式传输,我们就应用到了REST(Representational State Transfer)表述性状态转移,不是一种标准,而是一种软件架构风格。
基于REST的服务于基于SOAP的服务相比,性能、效率和易用性都更高,而SOAP协议非常的复杂和不透明。REST受到越来越多的web服务供应商欢迎。
REST三个特点
1、网络上所有的事物都可被抽象成资源
2、每个资源都有一个唯一的资源标示符URL
3、使用标准方法操作资源
4、所有的操作都是无状态的
5、通过缓存来提高性能
REST是基于Http协议的,任何资源的操作行为都是通过Http协议来实现。Http把对一个资源的操作限制在4个方法以内,GET、POST、PUT和DELETE,这正是对资源CRUD的实现。
REST的资源表述形式以XML、HTML、JSON,或者其他任意资源的形式,这取决于服务提供商和消费服务的用户
但是REST不是万能的。操作无状态也会带来巨大的安全问题,如何授权和验证用户?如果要求每次请求都包含完整的身份和验证信息,又如何避免信息泄漏?复杂的功能挑战架构的易用性,这就需要在性能与功能间权衡,究竟该用REST还是SOAP。
在使用REST的时候我们使用WebHttpBinding来公开服务,和SOPA的服务契约不同的在定义服务的终结点的时候我们需要WebGetAttribute或webInvokeAttribute属性将各个服务操作映射到URL,同时定义调用和返回结果的信息。上一篇我们已经介绍。
定义服务契约:
与普通WCF服务契约不同的是,需要额外用WebGet或者WebInvoke指定REST访问的方式。另外还要指定消息包装样式和消息格式,默认的消息请求和响应格式为XML,若选择JSON需要显式声明。
新建客户端,我们新建一个类实现两种方式数据(GET/POST)的推送
using System.Text;
using System.Net;
using System.IO;
using System.Web;
namespace Client
{
public class MyClient
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="baseUrl">
/// </param>
public MyClient(string baseUri)
{
this.BaseUri = baseUri;
}
/// <summary>
/// 基地址
/// </summary>
private string BaseUri;
/// <summary>
/// Post调用
/// </summary>
/// <param name="data"></param>
/// <param name="uri"></param>
/// <returns></returns>
public string Post(string data, string uri)
{
//Web访问对象
string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
//转成网络流
byte[] buf = UnicodeEncoding.UTF8.GetBytes(data);
//设置
myRequest.Method = "POST";
myRequest.ContentLength = buf.Length;
myRequest.ContentType = "text/html";
// 发送请求
Stream newStream = myRequest.GetRequestStream();
newStream.Write(buf, 0, buf.Length);
newStream.Close();
// 获得接口返回值
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string ReturnXml = HttpUtility.HtmlDecode(reader.ReadToEnd());
reader.Close();
myResponse.Close();
return ReturnXml;
}
/// <summary>
/// Get调用
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public string Get(string uri)
{
//Web访问对象
string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.Method = "GET";
// 获得接口返回值
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd());
reader.Close();
myResponse.Close();
return ReturnXml;
}
}
}
实例化该类对服务中的两种方法进行调用,我们先看下服务中公开的服务契约:
namespace Client
{
class Program
{
static void Main(string[] args)
{
//get
MyClient client = new MyClient("http://127.0.0.1:4600/json");
string uriGet = string.Format("Sutdent/{0}/{1}", "wuhong", "1980-2-14");
string retGet = client.Get(uriGet);
Console.WriteLine(retGet);
Console.WriteLine("-----------------------------");
/// Post
string uriPost = "Sutdent/{0}/{dayOfbirth}";
string data = string.Format("Sutdent/{0}/{1}", "wuhong", "1980-2-14");
string retPost = client.Post(data, uriPost);
Console.WriteLine(retPost);
Console.ReadLine();
}
}
}
看来我们wcf服务是建立成功的...
因为我们公开了两种数据契约一种是json、另一种是xml,我们看一下那个地址是否正确我们改一下:
晒结果:
看来是成功的了...当然在跨平台性两者具有同样的优越性,但是在数据量上或者易于操作性等方面,很显然json要优于xml.
一般我们就采取这种方式来实现服务的发布