ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
本文将通过一个简单的实例,介绍如何创建一个Rest服务接口,以及通过JQUERY去对它进行调用;主要采取两种方式分别为Get跟Post;其中将通过Post提交简单类型(Sring)以及复杂类型(自定义实现UserModel)与Rest服务进行交互;
一 Rest服务创建
其中Web客户端(ClintWeb)不对其它层的引用,只通过Rest部署后的服务进行效互;
1:实体层(Model)

using System.Runtime.Serialization; namespace Model
{
[DataContract]
public class UserModel
{
[DataMember]
public int ID { get; set; } [DataMember]
public string UserName { get; set; } [DataMember]
public string PassWord { get; set; } [DataMember]
public int Age { get; set; } public override string ToString()
{
return string.Format("ID:{0};姓名: {1};年龄:{2};密码:{3}",ID, UserName, Age, PassWord);
}
}
}

此处要注意[DataContract],[DataMember]在命名空间using System.Runtime.Serialization下面;
2:接口层(IServiceInterface)

using System.ServiceModel.Web;
using System.ServiceModel;
using Model;
namespace IServiceInterface
{
[ServiceContract]
public interface IUser
{
[WebGet(UriTemplate = "/{ID}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
UserModel GetUserFromID(string ID); [WebGet(UriTemplate = "All", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
List<UserModel> GetAllUser(); [WebInvoke(UriTemplate = "/User/UserName", Method = "POST", RequestFormat = WebMessageFormat.Json,ResponseFormat=WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
String GetUserName(string Name); [WebInvoke(UriTemplate = "/User/Post", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string UpdateUser(UserModel model);
}
}

3:逻辑层(ServiceBll)

using IServiceInterface;
using Model;
namespace ServiceBll
{
public class UserBll:IUser
{
public static List<UserModel> GetUserList()
{
List<UserModel> list = new List<UserModel>()
{
new UserModel(){ID=1,UserName="踏浪帅",PassWord="123456",Age=27}, new UserModel(){ID=2,UserName="wujunyang",PassWord="345678",Age=30},
new UserModel(){ID=3,UserName="cnblogs",PassWord="987654",Age=33}
};
return list;
} public UserModel GetUserFromID(string ID)
{
UserModel item = GetUserList().Where(a => a.ID == int.Parse(ID)).SingleOrDefault();
if (item != null)
{
return item;
}
else
{
return new UserModel();
}
} public List<UserModel> GetAllUser()
{
return GetUserList();
} public string UpdateUser(UserModel model)
{
return model.ToString();
} public String GetUserName(string Name)
{
return "您好:" + Name;
}
}
}

后面创建的客户端传参数要跟上面各个方法的参数相同,比如:Name,model等
4:Rest服务(RestService)
此处新建一个文本文件把它修改成.svc格式,在其里面写入:
<%@ ServiceHost Language="C#" Debug="true" Service="ServiceBll.UserBll" %>
web.config文件内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MapConfigBehavior">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
<serviceMetadata httpGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webHttpBindConfig" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="104857600">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/>
<security mode="None"></security>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="ServiceBll.UserBll" behaviorConfiguration="MapConfigBehavior">
<endpoint binding="webHttpBinding" contract="IServiceInterface.IUser" bindingConfiguration="webHttpBindConfig" behaviorConfiguration="webHttp"/>
</service>
</services>
</system.serviceModel>
</configuration>

通过上面的代码我们便简单完成一个Rest服务的创建,接着我们把它发布在IIS里面;进一步可以为客户端进行调用做准备;
二 客户端Web调用服务
客户端主要运用JQUERY的Ajax进行服务调用;
1:通过Get方式进行调用返回单个实例的JSON:

$.ajax({
type: "get",
contentType: "application/json; charset=utf-8",
url: "http://localhost:8089/WcfRestService.svc/1",
success: function (userInfo) {
alert("用户名:" + userInfo.UserName + " 密码:" + userInfo.PassWord + " 年龄:" + userInfo.Age);
},
error: function (error) {
alert("出错:" + error.responseText);
}
});

运行效果:
2:通过Get方式进行调用返回列表实例的JSON

$.ajax({
type: "get",
contentType: "application/json; charset=utf-8",
url: "http://localhost:8089/WcfRestService.svc/All",
success: function (userlist) {
$.each(userlist.GetAllUserResult, function (item, value) {
alert(value.ID + "|" + value.UserName + "|" + value.PassWord + "|" + value.Age);
})
}
});

运行效果:
![]() |
![]() |
![]() |
其中要注意要从结果userlist.GetAllUserResult进行循环,我们可以能过IE的F12进行查看,不难发现是跟我们接口服务名称有关的 对应接口名称+Result 此处我们的定义接口名称为GetAllUser
3:通过Post方式进行简单类型的交互

var UserMsg = { 'Name': '踏浪帅' };
var UserMessage = JSON2.stringify(UserMsg);
$.ajax({
type: "POST",
contentType: "application/json",
url: "http://localhost:8089/WcfRestService.svc/User/UserName",
data: UserMessage,
dataType: "json",
crossDomain: false,
success: function (userNameInfo) {
alert(userNameInfo);
},
error: function (error) {
alert(error.responseText);
}
});

运行效果:
其中要注意var UserMsg = { 'Name': '踏浪帅' }; "Name"必需要跟Rest服务接口的参数是一样;JSON2.stringify(UserMsg)则是把它转化成JSON格式,其定义在json2.js里;
4:通过Post方式进行复杂类型(自定义实体)的交互

var UserMsg = { 'model': { 'ID': '6', 'UserName': '踏浪帅', 'PassWord': '123456', 'Age': '27'} };
var UserMessage = JSON2.stringify(UserMsg);
$.ajax({
type: "POST",
contentType: "application/json",
url: "http://localhost:8089/WcfRestService.svc/User/Post",
data: UserMessage,
dataType: "json",
crossDomain: false,
success: function (userNameInfo) {
alert(userNameInfo);
},
error: function (error) {
alert(error.responseText);
}
});

运行效果:
其中要注意交互实体的书写方式,其中model是我们Rest服务接口定义的参数,其它则是实体的名称和对应的值,都是以字符串格式;特别要注意接口服务中采用Post的BodyStyle= WebMessageBodyStyle.WrappedRequest;这个问题困惑好几天,最后发现把它设置成BodyStyle = WebMessageBodyStyle.Bare;服务接口就一直交互失败;
三 理论知识
1:接口服务中的WebMessageBodyStyle枚举,首先我们先看一下它几个值

// 一个指定是否包装参数和返回值的枚举。
public enum WebMessageBodyStyle
{
// 摘要: 不包装请求和响应。
Bare = 0, // 摘要:包装请求和响应。
Wrapped = 1, // 摘要:包装请求,但不包装响应。
WrappedRequest = 2, // 摘要:包装响应,但不包装请求。
WrappedResponse = 3,
}

先前一直Post交互失败,就是因为对枚举了解不够,导致一直查找不出错误的所在地方;这边引用一下蒋老师的文章来说明几个的区别:请求消息和回复消息分别是对操作方法输入参数和返回值(输出参数和引用参数)的封装,WebMessageBodyStyle中的Bare表示请求消息和回复消息的主体部分仅仅包含针对输入参数和返回值(输出参数和引用参数)序列化后的内容,而Wrapped则会在外面包装一个基于当前操作的“封套”。枚举项WrappedRequest和WrappedResponse用于单独针对请求消息和回复消息的主体进行封装。WebGetAttribute与WebInvokeAttribute的属性BodyStyle的默认值为Bare。如果该属性被设置成WrappedRequest,则回复消息主体依然采用Bare风格;
如果该属性被设置成WrappedResponse,则请求消息主体依然采用Bare风格。布尔类型的只读属性IsBodyStyleSetExplicitly表示是否针对属性BodyStyle进行了显示设置。在使用POST操作时,在客户端与服务端交互过程中,需要指定WebMessageBodyStyle;在GET操作时,不论格式,可以不必指定。
四 工具运用
在上面创建的服务中定义Get及Post方式进行调用服务,其实我们也可以通过Fiddler来模拟交互;
1:选择Get方式,并把服务的地址写入,然后Execute
选择运行完的Web会话,在"嗅探"->"TextView",可以看到调用服务返回的内容
2:选择Post方式,并把服务的地址写入,在Request Headers写入"Content-Type:application/json" 在RequestBody写入要传递给服务的参数和值
执行后返回的结果如下:
复杂类型的Post方式
执行后返回的结果如下:
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮,若有不足欢迎指正。 因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读(源代码下载)
ASP.NET交互Rest服务接口(Jquery的Get与Post方式)的更多相关文章
- 记录ASP.NET Web API 服务接口响应时间
实现起来很简单,一个Filter就可以搞定!!! /// <summary> /// 监控接口执行时间 /// </summary> public class TimingAc ...
- Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则
文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- ASP.NET WebApi服务接口如何防止重复请求实现HTTP幂等性
一.背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi.在我们平时开发项目中可能会出现下面这些情况; 1).由于用户误操作,多次点击网页表单提交按钮.由于网速等原因造成页面卡顿,用户重复刷新 ...
- ASP.NET WebAPI构建API接口服务实战演练
一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...
- Asp.Net Core微服务再体验
ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...
- Asp.Net Core微服务初体验
ASP.Net Core的基本配置 .在VS中调试的时候有很多修改Web应用运行端口的方法.但是在开发.调试微服务应用的时候可能需要同时在不同端口上开启多个服务器的实例,因此下面主要看看如何通过命令行 ...
- 第6章 服务模式 Service Interface(服务接口)
Service Interface(服务接口) 上下文 您正在设计企业应用程序,并且需要能够通过网络使用其部分功能.此功能需要能够被各类系统使用,因此互操作性是设计的重要方面.除互操作性之外,可能还需 ...
- Dubbo服务接口的设计原则
1.接口粒度 1.1 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持.同时可以减少系统间的网络交互. 1.2 服务 ...
随机推荐
- 谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN
声明: 1.这篇文章是原创.非复制或转载过来. 2.在本文中,参数都亲自做过实验证明. 3.这篇文章谈到了Hibernate配置基于注释的方法.hbm语法不可用. 不清JPA.Hibernate.EJ ...
- zTree市县实现三个梯级DAO接口测试
zTree市县实现三个梯级DAO接口测试 ProvinceDaoTest.java: /** * @Title:ProvinceDaoTest.java * @Package:com.gwtjs.da ...
- crawler_JVM_DNS_在爬虫中的应用
DNS解析:即由域名 经过dns解析,跳转到真正服务器的地址,这个重复解析的耗时占请求很大比例. 在设计爬虫时比较细粒度的控制下,需要考虑dns解析. jdk从1.5往后对dns缓存有默认设置, 详见 ...
- java_ log4j的基本配置参数
目标: err级别发送邮件 ,要求美观 ,信息详细 开工: 材料: 三个jar ,版本不建议高,不能低. 方便起见,打包下载即可 http://pan.baidu.com/s/1mgmfyvY ...
- nginx基础入门
nginx常常被用来处理静态资源如css.js.图片.html等,也被用作反向代理server.邮件server,也时常拿来做负载均衡.它的优势主要体如今对静态资源的处理上,这次抽出了点时间整理了一些 ...
- 使用Json让Java和C#沟通的方法
原文:使用Json让Java和C#沟通的方法 最近很忙啊,新项目下来了,都没时间写博客了.频率降低点,但不能不总结跟大家分享啊. 我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言 ...
- JavaScript中,关于new的那些事
这篇文章是自己对new学习过程中的一些理解,有不对的地方希望指出,接受组织的批评教育. 导火线,前段时间学习jQuery的时候,看到源码中有这样一段: jQuery = function(select ...
- UITableView的常用方法
一.UITableView的代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtI ...
- AngularJS模块的详解
AngularJS模块的详解 在讲angularjs的模块之前,我们先介绍一下angular的一些知识点: AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规 ...
- CSS3制作日历
目标是制作如下面DEMO显示的一个日历效果: HTML Markup 先来看看其结构: <div class="calendar"> <span class=&q ...