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需要显式声明。

      UriTemplate用来将方法映射到具体的Uri上,但如果不指定映射,将映射到默认的Uri。比如采用Get访问的GetUser方法,默认映射是:/GetUser?Name={Name}&Position={Position}。
 
现在我们通过客户端实现对上一篇的文章中的服务进行调用
为了方便我将上一篇的服务实现了vs自寄宿:

新建客户端,我们新建一个类实现两种方式数据(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;
}
}

}

实例化该类对服务中的两种方法进行调用,我们先看下服务中公开的服务契约:

一个是默认的Get,一个是显示指定的POST访问;我们来看客户端:
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.

一般我们就采取这种方式来实现服务的发布

原文地址:https://www.cnblogs.com/zhijianliutang/p/2269239.html