WCF学习之旅—实现支持REST客户端应用(二十四)

WCF学习之旅—实现REST服务(二十二)

WCF学习之旅—实现支持REST服务端应用(二十三)

在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持REST的WCF服务端程序,本文介绍如何调用上一篇文章介绍的RestFul服务端。

五、Windows客户端调用

为了强调REST的通用性,客户端不用WCF的形式调用服务,而是采用HttpWebResponse通过编程方式直接访问,消息格式我们选XML。

首先,我们使用C#来封装一个RestHelper类,实现HTTP的GET和POST的请求方法,代码如下。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace WinClient
{

    public class RestHelper
    {      

            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="baseUrl"></param>
            public RestHelper(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);

             // 获得接口返回值
              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;
         }
    }

}

其次,我们来实现主函数,按顺序调用两个接口,并显示返回值。需要注意XML约定的命名空间。

我们在visual studio 2015中创建一个Windows窗体,名称为Form1,在Form1中放两个按钮,一个是“Rest Get”,另一个是"Rest Post"。

1)在“Rest Get”按钮中实现Get方法,代码如下:

 private void buttonRest_Click(object sender, EventArgs e)
        {
            RestHelper client = new RestHelper("http://127.0.0.1:8888/");

            //Get
            string uriGet = string.Format("Books/Get/{0}", "2");
            string getData = client.Get(uriGet);
            textBoxMsg.Text = getData;
        }

2) 在visual studio 2015中启动客户端应用程序,然后使用鼠标点击“Rest Get”按钮,结果如下图。

3)在“Rest Post”按钮中实现Post方法,代码如下:

  private void buttonRestPost_Click(object sender, EventArgs e)
        {

            RestHelper client = new RestHelper("http://127.0.0.1:8888/");
            //Post

            string uriPost = "Books/Add";
            string data = "<Books xmlns=\"http://tempuri.org/\"><AuthorID>1</AuthorID><Category>MS</Category><Name>数学之美(第二版) </Name><Numberofcopies>12</Numberofcopies><Price>37.99</Price><PublishDate>2009-01-11T00:00:00</PublishDate><Rating>A</Rating></Books>";

            string postResult = client.Post(data, uriPost);
            textBoxMsg.Text = "\r\n\r\n\r\n" + postResult;
        }

4) 在visual studio 2015中启动客户端应用程序,然后使用鼠标点击“Rest Post”按钮,结果如下图。

 六、通过浏览器来访问WCF服务

通过浏览器来访问WCF服务,主要是用jquery实现GET和POST访问,采用jquery访问REST服务,消息格式选择Xml。

1) 我们在项目目录下面创建一个testRest.html文件,文件中的内容如下:

<html>
     <head>
         <script src="../../Scripts/jquery-2.2.3.min.js" type="text/javascript"></script>
         <script type="text/javascript">  

 function AjaxGet() {
                  $.ajax({
                     type: "GET",
                     contentType: "text/xml",
                     url: "http://127.0.0.1:8888/Books/Get/5",                  

                     success: function (data) {
                         alert(data);
                         $("#TextGet").val(data);
                     },

   complete:function(XMLHttpRequest,textStatus){
               alert(XMLHttpRequest.responseText);
               alert(textStatus);            

            },

                     error: function (data) {
                         alert(data);
                     }
                 });

 }

             function HttpPost() {
                 var str = "<Books xmlns=\"http://tempuri.org/\"><AuthorID>1</AuthorID><Category>MS</Category><Name>math book ver 1 </Name><Numberofcopies>12</Numberofcopies><Price>47.99</Price><PublishDate>2012-01-11T00:00:00</PublishDate><Rating>A</Rating></Books>";
                 $.ajax({
                     type: "POST",
                     contentType: "text/xml",
// datatype:"xml",
                     url: "http://127.0.0.1:8888/Books/Add",

                     data: str,
                     success: function (data) {
                         alert(data);
                         $("#TextPost").val(data);
                     },
   complete:function(XMLHttpRequest,textStatus){
               alert(XMLHttpRequest.responseText);
               alert(textStatus);           

            },
                     error: function (data) {
                         alert(data);
                     }
                 });
             }

         </script>
         <style type="text/css">
             #TextGet
             {
                 width: 700px;
             }

             #TextPost
             {
                 width: 700px;

             }
         </style>
     </head>
     <body>

         <input id="ButtonGet" type="button" value="GET" onclick="AjaxGet()" />

         <input id="TextGet" type="text" />
         <p/>    

         <input id="ButtonPost" type="button" value="POST" onclick="HttpPost()" />
         <input id="TextPost" type="text" />

     </body>
  </html>

2)使用浏览器IE打开testRest.html,然后点击“ GET” 按钮,结果如下图。

3)使用浏览器IE打开testRest.html,然后点击“ POST” 按钮,结果如下图。

备注:

在firefox下面,怎么访问都不成功,都是报405(Method not allowed)错误信息,在IE下面访问正常,具体原因没找到,如果有知道解决方案的,请留言。

时间: 2024-12-14 07:29:09

WCF学习之旅—实现支持REST客户端应用(二十四)的相关文章

WCF学习之旅—第三个示例(二十七)

一.前言 通过前面二十几个章节的学习,我们知道了什么是WCF:WCF中的A.B.C:WCF的传输模式:WCF的寄宿方式:WCF的异常处理.本文综合应用以上知识点,一步一步写一个小的WCF应用程序——书籍管理系统(BookMgr). 这个示例就是一个非常简单的书籍管理系统,功能有:查询.修改.新增.删除(不包括安全.优化等相关问题).异常处理.WCF的增删改查和WinForm相差无几.WCF只是把具体“实现”写在“服务端”,而“调用”放在了“客户端”. 二.BookMgr说明 1)Demo的 “服

数往知来 JQuery 缩略图_客户端文件下载&lt;二十四&gt;

一.缩略图 -->首先找到图片.或和用户的上传结合在一起 -->创建一个画布  与之前不同的是我们的画布给它一个固定的大小 -->创建一个画笔 --> context.Response.ContentType = "image/jpeg"; //得到图片的路径 string filePath = context.Server.MapPath("image/1.jpg"); //读取图片 using (Image img = Image.Fro

WCF学习之旅—基于ServiceDebug的异常处理(十七)

WCF学习之旅—WCF中传统的异常处理(十六) 二.基于ServiceDebug的异常处理 从前面的示例中,可以看到客户端捕获了异常,这是我们处理异常的前提.为了有利于我们进行有效的调试,WCF提供了ServiceDebug Service Behavior.我们可以通过设置<serviceDebug includeExceptionDetailInFaults="True" />属性设为true,那么如果服务端抛出异常,WCF会简单得包装这个异常并把它置于Soap中Res

winform学习日志(二十四)----------datetime和timer的使用(小小幻灯片)

一:展示图片 每秒换一次图片,一共六十张图片,00-59 二:代码 a,设计代码 namespace timePicture { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了.如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧! 一.I/O概述 I/O全名:Input Output

学习OpenCV范例(二十四)—ViBe前景检测(二)

最近导师没给什么项目做,所以有那么一点点小时间,于是就研究起了前景检测,既然前景检测有很多种算法,那干脆就把这些模型都学起来吧,以后用到前景检测时至少还有那么几种方法可以选择,上次介绍的是GMM模型,其实GMM模型本身就是一个很不错的模型,现在也很多人在研究,并且做改进,主要是OpenCV有函数调用,用起来非常方便,当我们都在兴高采烈的讨论GMM各种好的时候,B哥不爽了,他说老子是搞前景检测的,怎么可能让你们这么嚣张,而且老子就不按照你那套路来,什么高斯模型,混合高斯模型,我统统不用,就来个简单