zoukankan      html  css  js  c++  java
  • 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.

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

  • 相关阅读:
    Javascript高级程序设计第二版第十四章异常笔记
    九大另类中文垂直搜索引擎
    弹出拖动层
    Javascript高级程序设计第二版第十一章DOM2,DOM3笔记
    【物联网智能网关15】WAV播放器(WinForm+WavPlay库实例)
    【物联网中间件平台03】YFIOs安装指南
    【物联网中间件平台05】YFIOs策略开发指南
    【物联网中间件平台01】真正面向物联网的组态软件 YFIOs和YFHMI的前生今世
    【物联网中间件平台02】YFIOs技术白皮书(V1.1)
    【物联网中间件平台06】RFID刷卡拍照
  • 原文地址:https://www.cnblogs.com/zhijianliutang/p/2269239.html
Copyright © 2011-2022 走看看