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, , 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}", "");
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下面访问正常,具体原因没找到,如果有知道解决方案的,请留言。

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

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

    在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...

  2. WCF学习之旅—基于Fault Contract 的异常处理(十八)

       WCF学习之旅—WCF中传统的异常处理(十六) WCF学习之旅—基于ServiceDebug的异常处理(十七) 三.基于Fault Contract 的异常处理 第二个示例是通过定制Servic ...

  3. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  4. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  5. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  6. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

  7. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  8. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

  9. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

随机推荐

  1. 【探索】在 JavaScript 中使用 C 程序

    JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑.当需要传输通信时,我们大多选择 JSON 或 XML 格式. 但在数据长度非常苛刻的情况下,文本协议的效率就非常低了,这时不得不使用二进 ...

  2. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  3. react-redux

    1. 首先redux,与react是两个独立的个体,项目中可以只用react,也可以只用redux 1.1 react-redux: 是一个redux作者专门为react制作的 redux, 增加了新 ...

  4. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  5. PHP设计模式(七)适配器模式(Adapter For PHP)

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...

  6. 文档对象模型DOM通俗讲解

    转自:http://www.jb51.net/article/42671.htm 在开始之前先说一点,DOM是非常容易理解的,但是大家说的太官方,让人很是难于理解,我们就用非常简单的语言翻译一遍.加深 ...

  7. springmvc 多数据源 SSM java redis shiro ehcache 头像裁剪

    获取下载地址   QQ 313596790  A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:31359679 ...

  8. 初识的Spring Mvc-----原理

    一.Spring Mvc简介 Spring Mvc(Spring Web Mvc) 属于表现层的框架. 二.Spring结构图 Spring Mvc是Spring框架里面web模块的一部分,是在Spr ...

  9. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  10. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...