服务端和Android交互问题,服务端有个付款墨刀页面内交互,没有点击付款按钮之前返回json值Fail,点击付款返回OK

基于 REST 的 Web 服务:基础
基础REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。 如果考虑使用它的 Web 服务的数量,REST 近年来已经成为最主要的 Web 服务设计模型。 事实上,REST 对 Web 的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。
REST 这个概念于 2000 年由 Roy Fielding 在就读加州大学欧文分校期间在学术论文“Architectural Styles and the Design of Network-based Software Architectures”(请参见以获取此论文的链接)首次提出,他的论文中对使用 Web 服务作为分布式计算平台的一系列软件体系结构原则进行了分析,而其中提出的 REST 概念并没有获得现在这么多关注。 多年以后的今天,REST 的主要框架已经开始出现,但仍然在开发中,因为它已经被广泛接纳到各个平台中,例如通过 JSR-311 成为了 Java™ 6 不可或缺的部分。
本文认为,对于今天正在吸引如此多注意力的最纯粹形式的 REST Web 服务,其具体实现应该遵循四个基本设计原则: 显式地使用 HTTP 方法。无状态。公开目录结构式的 URI。传输 XML、JavaScript Object Notation (JSON),或同时传输这两者。 下面几个部分将详述这四个原则,并提供技术原理解释,说明为什么这些原则对 REST Web 服务设计人员非常重要。显式地使用 HTTP 方法 基于 REST 的 Web 服务的主要特征之一是以遵循 RFC 2616 定义的协议的方式显式使用 HTTP 方法。例如,HTTP GET 被定义为数据产生方法,旨在由客户端应用程序用于检索资源以从 Web 服务器获取数据,或者执行某个查询并预期 Web 服务器将查找某一组匹配资源然后使用该资源进行响应。 REST 要求开发人员显式地使用 HTTP 方法,并且使用方式与协议定义一致。 这个基本 REST 设计原则建立了创建、读取、更新和删除(create, read, update, and delete,CRUD)操作与 HTTP 方法之间的一对一映射。 根据此映射:若要在服务器上创建资源,应该使用 POST 方法。若要检索某个资源,应该使用 GET 方法。若要更改资源状态或对其进行更新,应该使用 PUT 方法。若要删除某个资源,应该使用 DELETE 方法。许多 Web API 中所固有的一个令人遗憾的设计缺陷在于将 HTTP 方法用于非预期用途。 例如,HTTP GET 请求中的请求 URI 通常标识一个特定的资源。 或者,请求 URI 中的查询字符串包括一组参数,这些参数定义服务器用于查找一组匹配资源的搜索条件。 至少,HTTP/1.1 RFC 是这样描述 GET 方法的。 但是在许多情况下,不优雅的 Web API 使用 HTTP GET 来触发服务器上的事务性操作——例如,向数据库添加记录。 在这些情况下,GET 请求 URI 属于不正确使用,或者至少不是以基于 REST 的方式使用。 如果 Web API 使用 GET 调用远程过程,则应该类似如下:GET /adduser?name=Robert HTTP/1.1这不是非常优雅的设计,因为上面的 Web 方法支持通过 HTTP GET 进行状态更改操作。 换句话说,该 HTTP GET 请求具有副作用。 如果处理成功,则该请求的结果是向基础数据存储区添加一个新用户——在此例中为 Robert。 这里的问题主要在语义上。 Web 服务器旨在通过检索与请求 URI 中的路径(或查询条件)匹配的资源,并在响应中返回这些资源或其表示形式,从而响应 HTTP GET 请求,而不是向数据库添加记录。 从该协议方法的预期用途的角度看,然后再从与 HTTP/1.1 兼容的 Web 服务器的角度看,以这种方式使用 GET 是不一致的。
除了语义之外,GET 的其他问题在于,为了触发数据库中的记录的删除、修改或添加,或者以某种方式更改服务器端状态,它请求 Web 缓存工具(爬网程序)和搜索引擎简单地通过对某个链接进行爬网处理,从而意外地做出服务器端更改。 克服此常见问题的简单方法是将请求 URI 上的参数名称和值转移到 XML 标记中。 这样产生的标记是要创建的实体的 XML 表示形式,可以在 HTTP POST 的正文中进行发送,此 HTTP POST 的请求 URI 是该实体的预期父实体(请参见清单 1 和 2):清单 1. 之前GET /adduser?name=Robert HTTP/1.1清单 2. 之后POST /users HTTP/1.1
Host: myserver
Content-Type: application/xml
&?xml version="1.0"?&
&name&Robert&/name&
&/user&上述方法是基于 REST 的请求的范例: 正确使用 HTTP POST 并将有效负载包括在请求的正文中。 在接收端,可以通过将正文中包含的资源添加为请求 URI 中标识的资源的从属资源,从而处理该请求;在此例下,应该将新资源添加为 /users 的子项。 POST 请求中指定的这种新实体与其父实体之间的包含关系类似于某个文件从属于其父目录的方式。 客户端设置实体与其父实体之间的关系,并在 POST 请求中定义新实体的 URI。 然后客户端应用程序可以使用新的 URI 获取资源的表示形式,并至少逻辑地指明该资源位于 /users 之下,如清单 3 所示。清单 3. HTTP GET 请求GET /users/Robert HTTP/1.1
Host: myserver
Accept: application/xml以这种方式使用 GET 是显式的,因为 GET 仅用于数据检索。 GET 是应该没有副作用的操作,即所谓的等幂性 属性。当支持通过 HTTP GET 执行更新操作时,也需要应用类似的 Web 方法重构,如清单 4 所示。 清单 4. 通过 HTTP GET 进行更新GET /updateuser?name=Robert&newname=Bob HTTP/1.1这更改了资源的 name 特性(或属性)。 虽然可以将查询字符串用于此类操作,清单 4 就是一个简单的例子,但是在用于较复杂的操作时,这种将查询字符串作为方法签名的模式往往会崩溃。 由于您的目标是显式使用 HTTP 方法,鉴于上述的相同原因(请参见清单 5),更符合 REST 的方法是发送 HTTP PUT 请求以更新资源,而不是发送 HTTP GET。清单 5. HTTP PUT 请求PUT /users/Robert HTTP/1.1
Host: myserver
Content-Type: application/xml
&?xml version="1.0"?&
&name&Bob&/name&
&/user&使用 PUT 取代原始资源可以提供更清洁的接口,这样的接口与 REST 的原则以及与 HTTP 方法的定义一致。 清单 5 中的 PUT 请求是显式的,因为它通过在请求 URI 中标识要更新的资源来指向该资源,并且它在 PUT 请求的正文中将资源的新表示形式从客户端传输到服务器,而不是在请求 URI 上将资源属性作为参数名称和值的松散集合进行传输。 清单 5 还具有将资源从 Robert 重命名为 Bob 的效果,这样做会将其 URI 更改为 /users/Bob。 在 REST Web 服务中,使用旧的 URI 针对该资源的后续请求会产生标准的 404 Not Found 错误。
作为一般设计原则,通过在 URI 中使用名词而不是动词,对于遵循有关显式使用 HTTP 方法的 REST 指导原则是有帮助的。 在基于 REST 的 Web 服务中,协议已经对动词(POST、GET、PUT 和 DELETE)进行了定义。 在理想的情况下,为了保持接口的通用化,并允许客户端明确它们调用的操作,Web 服务不应该定义更多的动词或远程过程,例如 /adduser 或 /updateuser。 这条通用设计原则也适用于 HTTP 请求的正文,后者旨在用于传输资源状态,而不是用于携带要调用的远程方法或远程过程的名称。 无状态REST Web 服务需要扩展以满足日益提高的性能要求。 具有负载平衡和故障转移功能、代理和网关的服务器集群通常以形成服务拓扑的方式进行组织,从而允许根据需要将请求从一个服务器路由到另一个服务器,以减少 Web 服务调用的总体响应时间。 要使用中间服务器扩大规模,REST Web 服务需要发送完整、独立的请求;也就是说,发送的请求包括所有需要满足的数据,以便中间服务器中的组件能够进行转发、路由和负载平衡,而不需要在请求之间在本地保存任何状态。
完整、独立的请求不要求服务器在处理请求时检索任何类型的应用程序上下文或状态。
REST Web 服务应用程序(或客户端)在 HTTP Header 和请求正文中包括服务器端组件生成响应所需要的所有参数、上下文和数据。 这种意义上的无状态可以改进 Web 服务性能,并简化服务器端组件的设计和实现,因为服务器上没有状态,从而消除了与外部应用程序同步会话数据的需要。 图 1 演示了一个有状态的服务,某个应用程序可能向其请求多页结果集中的下一个页面,并假设该服务跟踪应用程序在结果集中导航时的离开位置。 在这个有状态的设计中,该服务递增并在某个位置存储 previousPage 变量,以便能够响应针对下一个页面的请求。图 1. 有状态的设计类似如此的有状态的服务变得复杂化了。 在 Java Platform, Enterprise Edition (Java EE) 环境中,有状态的服务需要大量的预先考虑,以高效地存储会话数据和支持整个 Java EE 容器集群中的会话数据同步。 在此类环境中,存在一个 Servlet/JavaServer Pages (JSP) 和 Enterprise JavaBeans (EJB) 开发人员非常熟悉的问题,他们经常在会话复制过程中艰难地查找引发 java.io.NotSerializableException 的根源。 无论该异常是由 Servlet 容器在 HttpSession 复制过程中引发的,还是由 EJB 容器在有状态的 EJB 复制过程中引发的,这都是个问题,会耗费开发人员几天的时间,尝试在构成服务器状态并且有时非常复杂的对象图表中查明没有实现 Serializable 的对象。 此外,会话同步增加了开销,从而影响服务器性能。
另一方面,无状态的服务器端组件不那么复杂,很容易跨进行负载平衡的服务器进行设计、编写和分布。 无状态的服务不仅性能更好,而且还将大部分状态维护职责转移给客户端应用程序。 在基于 REST 的 Web 服务中,服务器负责生成响应,并提供使客户端能够独自维护应用程序状态的接口。 例如,在针对多页结果集的请求中,客户端应该包括要检索的实际页编号,而不是简单地要求检索下一页(请参见图 2)。 图 2. 无状态的设计 无状态的 Web 服务生成的响应链接到结果集中的下一个页编号,并允许客户端完成所需的相关工作以便保留此值。 可以作为大致的分离将基于 REST 的 Web 服务设计的这个方面划分为两组职责,以阐明如何维护无状态的服务:服务器生成响应,其中包括指向其他资源的链接,以使得应用程序可以在相关资源之间导航。 此类响应嵌入了链接。 类似地,如果请求是针对父或容器资源,则基于 REST 的典型响应还可能包括指向父资源的子资源或从属资源的链接,以便这些资源保持连接在一起。 生成响应,其中指明了是否可缓存,以通过减少针对重复资源的请求数量或通过完全消除某些请求来改进性能。 服务器通过包括 Cache-Control 和 Last-Modified(日期值)HTTP 响应 Header 实现此目的。客户端应用程序使用 Cache-Control 响应 Header 确定是否缓存资源(创建资源的本地副本)。 客户端还读取 Last-Modified 响应 Header,并在 If-Modified-Since Header 中发回日期值,以向服务器询问资源是否已更改。 这称为条件 GET (Conditional GET),两个 Header 同时进行,因为服务器的响应为标准 304 代码 (Not Modified),如果请求的资源自从该时间以后尚未更改,则省略实际的资源。 HTTP 响应代码 304 意味着客户端可以安全地将资源表示形式的缓存本地副本作为最新版本使用,从而实际上跳过了后续 GET 请求,直到资源更改为止。
发送可独立于其他请求得到服务的完整请求。 这要求客户端充分利用 Web 服务接口指定的 HTTP Header,并在请求正文中发送完整的资源表示形式。 客户端发送的请求极少对先前的请求、某个会话在服务器上的存在性、服务器向请求添加上下文的能力或请求之间保留的应用程序状态做出假设。 客户端应用程序与服务之间的这种协作对于基于 REST 的 Web 服务中的无状态性极为重要。 它通过节省带宽和最小化服务器端应用程序状态改进了性能。 公开目录结构式的 URI从对资源寻址的客户端应用程序的角度看,URI 决定了 REST Web 服务将具有的直观程度,以及服务是否将以设计人员能够预测的方式被使用。 基于 REST 的 Web 服务的第三个特征完全与 URI 相关。REST Web 服务 URI 的直观性应该达到很容易猜测的程度。 将 URI 看作是自身配备文档说明的接口,开发人员只需很少(如果有的话)的解释或参考资料即可了解它指向什么,并获得相关的资源。 为此,URI 的结构应该简单、可预测且易于理解。实现这种级别的可用性的方法之一是定义目录结构式的 URI。 此类 URI 具有层次结构,其根为单个路径,从根开始分支的是公开服务的主要方面的子路径。 根据此定义,URI 并不只是斜杠分隔的字符串,而是具有在节点上连接在一起的下级和上级分支的树。 例如,在一个收集从 Java 到报纸的各种主题的讨论线程服务中,您可能定义类似如下的结构化 URI 集合:http://www.myservice.org/discussion/topics/{topic}根 /discussion 之下有一个 /topics 节点。 该节点之下有一系列主题名称,例如闲谈、技术等等,每个主题名称指向某个讨论线程。 在此结构中,只需在 /topics/ 后面输入某个内容即可容易地收集讨论线程。 在某些情况下,指向资源的路径尤其适合于目录式结构。 例如,以按日期进行组织的资源为例,这种资源非常适合于使用层次结构语法。 此示例非常直观,因为它基于规则:http://www.myservice.org/discussion//{topic}第一个路径片段是四个数字的年份,第二个路径片断是两个数字的日期,第三个片段是两个数字的月份。 这样解释它可能有点愚蠢,但这就是我们追求的简单级别。 人类和计算机能够容易地生成类似如此的结构化 URI,因为这些 URI 基于规则。 在语法的空隙中填入路径部分就大功告成了,因为存在用于组合 URI 的明确模式:http://www.myservice.org/discussion/{year}/{day}/{month}/{topic}在考虑基于 REST 的 Web 服务的 URI 结构时,需要指出的一些附加指导原则包括:隐藏服务器端脚本技术文件扩展名(.jsp、.php、.asp)——如果有的话,以便您能够移植到其他脚本技术而不用更改 URI。将所有内容保持小写。将空格替换为连字符或下划线(其中一种或另一种)。尽可能多地避免查询字符串。如果请求 URI 用于部分路径,与使用 404 Not Found 代码不同,应该始终提供缺省页面或资源作为响应。URI 还应该是静态的,以便在资源发生更改或服务的实现发生更改时,链接保持不变。 这可以实现书签功能。 URI 中编码的资源之间的关系与在存储资源的位置表示资源关系的方式无关也是非常重要的。 传输 XML、JSON 或同时传输这两者资源表示形式通常反映了在客户端应用程序请求资源时的资源当前状态及其属性。 这种意义上的资源表示形式只是时间上的快照。 这可以像数据库中的记录表示形式一样简单,其中包括列名称与 XML 标记之间的映射,XML 中的元素值包含行值。 或者,如果系统具有数据模型,那么根据此定义,资源表示形式是系统的数据模型中的对象之一的属性快照。 这些对象就是您希望您的 REST Web 服务为客户端提供的资源。 基于 REST 的 Web 服务设计中的最后一组约束与应用程序和服务在请求/响应有效负载或 HTTP 正文中交换的数据的格式有关。 这是真正值得将一切保持简单、可读和连接在一起的方面。 数据模型中的对象通常以某种方式相关,应该以在将资源传输到客户端应用程序时表示资源的方式,反映数据模型对象(资源)之间的关系。 在讨论线程服务中,连接的资源表示形式的示例可能包括根讨论主题及其属性,以及指向为该主题提供的响应的嵌入链接。
清单 6. 讨论线程的 XML 表示形式&?xml version="1.0"?&
&discussion date="{date}" topic="{topic}"&
&comment&{comment}&/comment&
&reply from="" href="/discussion/topics/{topic}/joe"/&
&reply from="" href="/discussion/topics/{topic}/bob"/&
&/replies&
&/discussion&最后,为了赋予客户端请求最适合它们的特定内容类型的能力,您的服务的构造应该利用内置的 HTTP Accept Header,其中该 Header 的值为 MIME 类型。 基于 REST 的服务使用的一些常见 MIME 类型如表 1 所示。表 1. 基于 REST 的服务使用的常见 MIME 类型MIME-TypeContent-TypeJSONapplication/jsonXMLapplication/xmlXHTMLapplication/xhtml+xml这使得服务可由运行在不同平台和设备上并采用不同语言编写的各种各样的客户端所使用。 使用 MIME 类型和 HTTP Accept Header 是一种称为内容协商 的机制,这种机制允许客户端选择适合于它们的数据格式,并最小化服务与使用服务的应用程序之间的数据耦合。 结束语 REST 并非始终是正确的选择。 它作为一种设计 Web 服务的方法而变得流行,这种方法对专有中间件(例如某个应用程序服务器)的依赖比基于 SOAP 和 WSDL 的方法更少。 在某种意义上,通过强调 URI 和 HTTP 等早期 Internet 标准,REST 是对大型应用程序服务器时代之前的 Web 方式的回归。 正如您已经在所谓的基于 REST 的接口设计原则中研究过的一样,XML over HTTP 是一个功能强大的接口,允许内部应用程序(例如基于 Asynchronous JavaScript + XML (Ajax) 的自定义用户界面)轻松连接、定位和使用资源。 事实上,Ajax 与 REST 之间的完美配合已增加了当今人们对 REST 的注意力。通过基于 REST 的 API 公开系统资源是一种灵活的方法,可以为不同种类的应用程序提供以标准方式格式化的数据。 它可以帮助满足集成需求(这对于构建可在其中容易地组合 (Mashup) 数据的系统非常关键),并帮助将基于 REST 的基本服务集扩展或构建为更大的集合。 本文仅略微谈到了基础,但愿本文的讨论会诱发您继续探索该主题。
相关主题您可以参阅本文在 developerWorks 全球站点上的
。阅读 Roy Fielding 的论文“”的第 5 章。获得有关
的更多信息。阅读图书 。下载 。获取 。下载用于 Java 的 REST 框架 。IBM developerWorks 提供了大量的文章,以及关于如何开发 Web 服务应用程序的初级、中级和高级教程。使用 进行试验!通过 IBM SOA 进行实际的亲手实践来提高您的 SOA 技能。提供 SOA 的概述,并介绍 IBM 是如何帮助您实现 SOA 的。访问 ,浏览有关这些技术主题以及其他方面的书籍。
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=SOA and web services, Web developmentArticleID=360384ArticleTitle=基于 REST 的 Web 服务:基础publish-date=全局Ajax事件处理程序
1.3 版本弃用的 API
1.7 版本弃用的 API
1.8 版本弃用的 API
1.9 版本弃用的 API
1.10 版本弃用的 API
3.0 版本弃用的 API
浏览器事件
DOM 插入并包裹现有内容
DOM 插入现有元素内
DOM 插入现有元素外
Style 属性
DOM 元素方法
对象实例特性
全局jQuery 对象特性
子元素筛选
可见性筛选
其他前端文档
jQuery.ajax( url [, settings ] )返回:
说明: 执行一个异步的HTTP(Ajax)的请求。
添加的版本: jQuery.ajax( url [, settings ] )
一个用来包含发送请求的URL字符串。
一个以"{键:值}"组成的AJAX 请求设置。所有选项都是可选的。可以使用设置任何默认参数。看下所有设置的完整列表。
添加的版本: jQuery.ajax(
[settings ] )
一个以"{键:值}"组成的AJAX 请求设置。所有选项都是可选的。可以使用设置任何默认参数。
accepts (默认: 取决于数据类型)
一个键/值对集合映射给定的dataType 到其的MIME类型,它可以从发送Accept请求头信息中获得。
请求头信息通知服务器该请求需要接收何种类型的返回结果。
例如,下面定义一个自定义类型的mycustomtype与请求一起发送:
accepts: {
mycustomtype: 'application/x-some-custom-type'
converters: {
'text mycustomtype': function(result) {
dataType: 'mycustomtype'});
对于这种类型,为了使其正常工作,您将需要在converters中指定补充项。
async (默认: true)
默认设置下,所有请求均为异步请求(也就是说这是默认设置为 true
)。如果需要发送同步请求,请将此选项设置为 false 。跨域请求和 dataType: "jsonp"
请求不支持同步操作。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。从 jQuery 1.8 开始, jqXHR ($.Deferred)中使用
async: false
已经过时。您必须使用的 success/error/complete 的回调选项代替相应的jqXHR对象的方法,比如jqXHR.done() 或者过时的jqXHR.success()。
beforeSend
settings )
请求发送前的回调函数,用来修改请求发送前jqXHR(在jQuery 1.4.x的中,XMLHttpRequest)对象,此功能用来设置自定义 HTTP 头信息,等等。该jqXHR和设置对象作为参数传递。这是一个 。在beforeSend函数中返回false将取消这个请求。从jQuery 1.5开始, beforeSend选项将被访问,不管请求的类型。
cache (默认: true, dataType为"script"和"jsonp"时默认为false)
如果设置为 false ,浏览器将不缓存此页面。注意: 设置cache为 false将在 HEAD和GET请求中正常工作。它的工作原理是在GET请求参数中附加"_={timestamp}"(译者注:时间戳)。该参数不是其他请求所必须的,除了在IE8中,当一个POST请求一个已经用GET请求过的URL。
textStatus )
请求完成后回调函数 (请求success 和 error之后均调用)。这个回调函数得到2个参数: jqXHR (在 jQuery 1.4.x中是 XMLHTTPRequest) 对象和一个描述请求状态的字符串("success", "notmodified", "nocontent","error", "timeout", "abort", 或者 "parsererror") 。从jQuery 1.5开始, complete设置可以接受一个函数的数组。每个函数将被依次调用。这是一个 。
一个以"{字符串/正则表达式}"配对的对象,根据给定的内容类型,解析请求的返回结果。 (新增)
contentType (default: 'application/x-www-form- charset=UTF-8')
当将数据发送到服务器时,使用该内容类型。默认值是"application/x-www-form- charset=UTF-8",适合大多数情况。如果你明确地传递了一个内容类型(Content-Type)给 $.ajax(),那么他总是会发送给服务器(即使没有数据要发送)。从 jQuery 1.6 开始,你可以传递false来告诉jQuery,没有设置任何内容类型头信息。 注意:W3C的XMLHttpRequest的规范规定,数据将总是使用UTF-8字符集传递给服务器;指定其他字符集无法强制浏览器更改编码。
注意:对于跨域请求,内容类型设置为application/x-www-form-urlencoded, multipart/form-data, 或 text/plain以外, 将触发浏览器发送一个预检OPTIONS请求到服务器。
这个对象用于设置Ajax相关回调函数的上下文。
默认情况下,这个上下文是一个ajax请求使用的参数设置对象,($.ajaxSettings合并独傲这个设置,传递给$.ajax)。比如指定一个DOM元素作为context参数,这样就设置了complete回调函数的上下文为这个DOM元素。就像这样:
url: "test.html",
context: document.body}).done(function() {
$(this).addClass("done");});
converters (默认: {"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML})
一个数据类型到数据类型转换器的对象。每个转换器的值是一个函数,返回经转换后的请求结果。
crossDomain (默认: 同域请求为false, 跨域请求为true)
如果你想在同一域中强制跨域请求(如JSONP形式),例如,想服务器端重定向到另一个域,那么需要将crossDomain设置为 true 。 (
发送到服务器的数据。它被转换成一个查询字符串,如果已经是一个字符串的话就不会转换。查询字符串将被追加到GET请求的URL后面。参见 processData
选项说明,以防止这种自动转换。对象必须为"{键:值}"格式。如果这个参数是一个数组,jQuery会按照traditional 参数的值, 将自动转化为一个同名的多值查询字符串(查看下面的说明)。愚人码头注:如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。(感谢 提供的翻译建议。)
dataFilter
一个函数被用来处理XMLHttpRequest的原始响应数据。这是一个预过滤功能,净化响应。您应该返回安全数据。提供data和type两个参数:data是Ajax返回的原始数据,type是调用jQuery.ajax时提供的dataType参数。
dataType (default: Intelligent Guess (xml, json, script, or html))
从服务器返回你期望的数据类型。
如果没有指定,jQuery将尝试通过MIME类型的响应信息来智能判断(一个XML MIME类型就被识别为XML,在1.4中 JSON将生成一个JavaScript对象,在1.4中 script 将执行该脚本,其他任何类型会返回一个字符串)。 可用的类型(以及结果作为第一个参数传递给成功回调函数)有:
"xml": 返回 XML 文档,可以通过 jQuery 处理。
"html": 返回纯文本 HTML 文本;包含的script标签会在插入DOM时执行。
"script": 把响应的结果当作 JavaScript 执行,并将其当作纯文本返回。默认情况下会通过在URL中附加查询字符串变量 ,_=[TIMESTAMP], 禁用缓存结果,除非设置了cache参数为true。注意: 在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(愚人码头注:因为将使用DOM的script标签来加载)
"json":把响应的结果当作 JSON 执行,并返回一个JavaScript对象。跨域"json" 请求转换为"jsonp",除非该请求在其请求选项中设置了jsonp:false。JSON 数据以严格的方式解析; 任何畸形的JSON将被拒绝,并且抛出解析错误信息。在jQuery1.9中,一个空响应也将被拒绝;服务器应该返回null或 {}响应代替。(见的更多信息,正确的JSON格式。)
"jsonp": 以
的方式载入 JSON 数据块。会自动在所请求的URL最后添加"?callback=?"。默认情况下会通过在URL中附加查询字符串变量 ,_=[TIMESTAMP], 禁用缓存结果,除非设置了cache参数为true。
"text": 返回纯文本字符串。
多个用空格分割的值:从 jQuery 1.5 开始,
jQuery可以内容类型(Content-Type)头收到并转换一个您需要的数据类型。例如,如果你想要一个文本响应为XML处理,使用"text xml"数据类型。您也可以将一个JSONP的请求,以文本形式接受,并用jQuery以XML解析: "jsonp text xml"。同样地可以使用"jsonp xml"简写,首先会尝试从 jsonp 到 xml 的转换,如果转换失败,就先将 jsonp 转换成 text, 然后再由 text 转换成 xml。
textStatus,
errorThrown )
请求失败时调用此函数。有以下三个参数:jqXHR (在 jQuery 1.4.x前为XMLHttpRequest) 对象、描述发生错误类型的一个字符串 和 捕获的异常对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是"timeout", "error", "abort" ,和 "parsererror"。
当一个HTTP错误发生时,errorThrown 接收HTTP状态的文本部分,比如: "Not Found"(没有找到) 或者 "Internal Server Error."(服务器内部错误)。 从jQuery 1.5开始, 在error设置可以接受函数组成的数组。每个函数将被依次调用。
注意:此处理程序在跨域脚本和JSONP形式的请求时不被调用。这是一个 。
global (默认: true)
无论怎么样这个请求将触发全局AJAX事件处理程序。默认是true 。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或者 ajaxStop。这可以用来控制各种 .
headers (默认: {})
一个额外的"{键:值}"对映射到请求一起发送。此设置会在beforeSend 函数调用之前被设置 ;因此,请求头中的设置值,会被beforeSend
函数内的设置覆盖 。
ifModified (默认: false)
只有上次请求响应改变时,才允许请求成功。使用 HTTP 包 Last-Modified 头信息判断。默认值是false,忽略HTTP头信息。在jQuery 1.4中,他也会检查服务器指定的'etag'来确定数据没有被修改过。
isLocal (默认: 取决于当前的位置协议)
允许当前环境被认定为“本地”,(如文件系统),即使jQuery默认情况下不会这么做。以下协议目前公认为本地:file, *-extension, and widget。如果isLocal设置需要修改,建议在$.ajaxSetup()方法中这样做一次。
在一个JSONP请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。在jQuery 1.5,,设置jsonp选项为false,阻止了jQuery从加入"?callback"字符串的URL或试图使用"=?"转换。在这种情况下,你也应该明确设置jsonpCallback设置。例如, { jsonp: false, jsonpCallback: "callbackName" }。如果你不信任你的Ajax请求的目标,出于安全原因,
考虑 设置jsonp 属性为false。
jsonpCallback
为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成一个独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。从jQuery 1.5开始,你也可以使用一个函数作为该参数设置,在这种情况下,该函数的返回值就是jsonpCallback的结果。
method (default: 'GET')
HTTP 请求方法 (比如:"POST", "GET
", "PUT")。 (添加版本: )。(愚人码头注:如果你使用jQuery 1.9.0 之前的版本,你需要使用type选项。)
一个mime类型用来覆盖XHR的 MIME类型。 ( 新增 )
用于响应HTTP访问认证请求的密码
processData (默认: true)
默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型
"application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
scriptCharset
仅适用于当"script"传输使用时(例如,跨域的"jsonp"或 dataType选项为"script" 和 "GET"类型)。请求中使用在script标签上设置charset 属性。通常只在本地和远程的内容编码不同时使用。
statusCode (默认: {})
一个 HTTP响应状态码 和 当请求响应相应的状态码时执行的函数 组成的对象。例如: 下面的代码将在http响应状态码为404时弹出“page not found”。
statusCode: {
404: function() {
alert("page not found");
如果请求成功,响应状态代码对应的函数会带着success回调函数相同的参数;如果请求结果是错误的(包含3xx之类的重定向),他们会采用error回调函数相同的参数。
( 新增 )(感谢 提供的翻译建议。)
textStatus,
请求成功后的回调函数。这个函数传递3个参数:从服务器返回的数据,并根据dataType参数进行处理后的数据或dataFilter回调函数,如果指定的话;一个描述状态的字符串;还有 jqXHR(在jQuery 1.4.x前为XMLHttpRequest) 对象 。在jQuery 1.5, 成功设置可以接受一个函数数组。每个函数将被依次调用。这是一个
设置请求超时时间(毫秒)。值为0表示没有超时。此设置将覆盖 里的全局设置。
超时周期开始于$.ajax 访问成功的那个时间点;如果几个其他请求都在进步并且浏览器有没有可用的连接,它有可能在被发送前就超时了。在 jQuery 1.4.x 和前面的版本中, 如果请求超时,XMLHttpRequest对象是处于无效状态;访问任何对象的成员可能会抛出一个异常。只有在 Firefox 3.0+,script 和 JSONP请求在超时后不能被取消;该脚本将运行即使超时后到达。
traditional
如果你想要用传统的方式来序列化数据,那么就设置为true。请参考工具分类下面的方法.
type (默认: 'GET')
method选项的别名。如果你使用jQuery 1.9.0 之前的版本,你需要使用type选项。
url (默认: 当前页面地址)
发送请求的地址。
于响应HTTP访问认证请求的用户名
xhr (默认: 当可用的ActiveXObject(IE)中,否则为XMLHttpRequest)
回调创建XMLHttpRequest对象。当可用时默认为ActiveXObject(IE)中,否则为XMLHttpRequest。提供覆盖你自己的执行的XMLHttpRequest或增强工厂。
一对“文件名-文件值”组成的映射,用于设定原生的 XHR对象。例如,如果需要的话,在进行跨域请求时,你可以用它来设置withCredentials为true。
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
在 jQuery 1.5中, withCredentials属性不会传递给原生的XHR从而对于需要使用此属性的 CORS 请求,则只能忽略这个属性。。出于这个原因,我们建议您使用jQuery1.5.1+,如果您需要使用它。
jQuery 发送的所有 Ajax 请求,内部都会通过调用 $.ajax() 函数来实现。通常没有必要直接调用这个函数,可以使用几个已经封装的简便方法,如和。如果你需要用到那些不常见的选项,那么, $.ajax()使用起来更灵活。
在简单地说, $.ajax()函数可以不带参数调用:
注意: 所有的选项都可以通过 函数来全局设置
这个例子中,不使用选项,加载当前页面的内容,但其结果没用的。若要使用结果,我们可以实现的回调功能之一。
jqXHR 对象
从jQuery 1.5开始,$.ajax() 返回XMLHttpRequest(jqXHR)对象,该对象是浏览器的原生的XMLHttpRequest对象的一个超集。例如,它包含responseText和responseXML属性,以及一个getResponseHeader()方法。当传输机制不是是XMLHttpRequest时(例如,一个JSONP请求脚本,返回一个脚本 tag 时),jqXHR对象尽可能的模拟原生的XHR功能。
从jQuery 1.5.1开始, jqXHR对象还包含了overrideMimeType方法 (它在jQuery 1.4.x中是有效的,但是在jQuery 1.5中暂时的被移除)。.overrideMimeType() 方法可能用在beforeSend()的回调函数中,例如,修改响应的Content-Type信息头:
url: "http://fiddle.jshell.net/favicon.png",
beforeSend: function ( xhr ) {
xhr.overrideMimeType("text/ charset=x-user-defined");
}}).done(function ( data ) {
if( console && console.log ) {
console.log("Sample of data:", data.slice(0, 100));
从 jQuery 1.5 开始,$.ajax()返回的jqXHR对象 实现了 Promise 接口, 使它拥有了 Promise 的所有属性,方法和行为。(见获取更多信息)。为了让回调函数的名字统一,便于在$.ajax()中使用。jqXHR也提供.error() .success()和.complete()方法。这些方法都带有一个参数,该参数是一个函数,此函数在 $.ajax()请求结束时被调用,并且这个函数接收的参数,与调用 $.ajax()函数时的参数是一致。这将允许你在一次请求时,对多个回调函数进行赋值,甚至允许你在请求已经完成后,对回调函数进行赋值(如果该请求已经完成,则回调函数会被立刻调用)。
jqXHR.done(function(data, textStatus, jqXHR) {});
一个可供选择的 success 回调选项的构造函数,.done()方法取代了的过时的jqXHR.success()方法。请参阅的实现细节。
jqXHR.fail(function(jqXHR, textStatus, errorThrown) {});
一种可供选择的 error 回调选项的构造函数,.fail()方法取代了的过时的.error()方法。请参阅的实现细节。
jqXHR.always(function(data|jqXHR, textStatus, jqXHR|errorThrown) { });(在jQuery 1.6 中添加)
一种可供选择的 complete 回调选项的构造函数,.always()方法取代了的过时的.complete()方法。
在响应一个成功的请求后,该函数的参数和.done()的参数是相同的:data, textStatus, 和 jqXHR 对象.对于失败的请求,参数和.fail()的参数是相同的:jqXHR 对象, textStatus, 和 errorThrown。请参阅的实现细节。
jqXHR.then(function(data, textStatus, jqXHR) {}, function(jqXHR, textStatus, errorThrown) {});
包含了 .done() 和 .fail()方法的功能,(从 jQuery 1.8 开始)允许底层被操纵。请参阅的实现细节。
推荐使用的注意事项:
jqXHR.success(), jqXHR.error(), 和 jqXHR.complete()回调从 jQuery 1.8开始 被弃用过时。他们将最终被取消,您的代码应做好准备, 从jQuery 3.0开始被删除,你可以使用jqXHR.done(), jqXHR.fail(), 和 jqXHR.always() 代替。
var jqxhr = $.ajax( "example.php" )
.done(function() { alert("success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });
jqxhr.always(function() { alert("second complete"); });
this在所有的回调中的引用,是这个对象在传递给$.ajax的设置中上下文;如果没有指定context(上下文),this 引用的是Ajax设置的本身。
为了向后兼容XMLHttpRequest ,一个 jqXHR 对象将公开下列属性和方法:
readyState
responseXML 和/或 responseText 当底层的请求分别作出 XML 和/或 文本响应
statusText
abort( [ statusText ] )
getAllResponseHeaders() 一个字符串
getResponseHeader( name )
overrideMimeType( mimeType )
setRequestHeader( name, value ) 用新值替换旧值,而不是将新值与旧值连接起来,这偏离了标准
statusCode( callbacksByStatusCode )
假如没有onreadystatechange属性,因为不同的状态可以分别在 success , error , complete和statusCode 方法中进行处理。
Callback Function Queues(回调函数)
beforeSend, error, dataFilter, success 和 complete接受的回调函数是在合适的时间调用。
从jQuery 1.5开始, fail , done ,和从jQuery 1.6开始的always回调钩子(hooks)采用先入先出队列管理。这意味着你可以为每个挂钩分配多个回调。见 ,这是实现内部的$.ajax()回调钩子(hooks)。
这里有$.ajax()提供的回调钩子 (hooks),如下:
beforeSend 在发送请求之前调用,它接收jqXHR对象和settings作为参数对象。
error 在请求出错时调用。如果请求失败,在它们的顺序依次登记。他们接受jqXHR ,字符串表示的错误类型,以及异常对象(如果有的话)。一些内置的错误会将 "abort", "timeout", "No Transport" 等字符串作为异常对象。
dataFilter 在请求成功之后调用。传入返回的数据以及dataType参数的值。并且必须返回新的数据(可能是处理过的)传递给success回调函数。
success 当请求成功并接收到返回数据之后调用。传入返回后的数据,以及包含成功代码的字符串和jqXHR对象。
Promise callbacks — .done(), .fail(), .always(), and .then() — 根据他们注册的顺序被调用。
complete 请求完成时,无论是在失败或成功,它们按顺序依次执行回调。他们收到jqXHR对象,以及一个包含成功或错误代码。
Data Types(数据类型)
$.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理。 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置。如果提供了dataType选项,
响应的Content-Type头信息将被忽略。
有效的数据类型是text, html, xml, json,jsonp,和 script.
如果指定的是text 或 html, 则不会预处理。
这些数据被简单地传递给成功处理函数,
并通过该jqXHR对象的responseText属性获得的。
如果指定的是xml,
响应结果作为,在传递给成功处理函数之前使用进行解析。
XML文档是可以通过该jqXHR对象的responseXML属性获得的。
如果指定的是json,响应结果作为一个对象,在传递给成功处理函数之前使用进行解析。 解析后的JSON对象可以通过该jqXHR对象的responseJSON属性获得的。
如果指定的是script ,$.ajax() 执行这段 JavaScript,这段 JavaScript 从服务器接收到,在传递给成功处理函数之前是一个字符串。
如果指定的是jsonp ,$.ajax()会自动在请求的URL后面增加一个查询字符串参数 callback=?(默认) 。传递给$.ajax() 设置中的jsonp 和 jsonpCallback属性可以被用来指定, 分别为 查询字符串参数的名称和JSONP回调函数的名称。服务器应返回有效的JavaScript,传递JSON响应到回调函数(愚人码头注:例如,flightHandler({"code": "CA1998","price": 1780,"tickets": 5});等)。 在包含JSON对象的相应结果传递给成功处理函数之前,$.ajax()
将执行返回的JavaScript, 调用JSONP回调函数。
更多JSONP信息可以参阅.
Sending Data to the Server(发送数据到服务器)
默认情况下,Ajax请求使用GET方法。如果要使用POST方法,可以设定type参数值。这个选项也会影响 data
选项中的内容如何发送到服务器。POST数据将被发送到服务器使用UTF-8字符集,根据W3C XMLHttpRequest的标准。
data选项既可以包含一个查询字符串,比如 key1=value1&key2=value2,也可以是一个映射,比如 {key1: 'value1', key2: 'value2'}
。如果使用了后者的形式,则数据再发送前会用 将其转换成查询字符串。这个处理过程也可以通过设置processData选项为false来回避。如果我们希望发送一个XML对象给服务器时,这种处理可能并不合适。并且在这种情况下,我们也应当改变contentType 选项的值,用其他合适的MIME类型来取代默认的
application/x-www-form-urlencoded 。
Advanced Options(高级选项)
global选项用于阻止响应注册的回调函数,比如, ,以及类似的方法。这在有些时候很有用,比如发送的请求非常频繁且简短的时候,就可以在里禁用这个。跨域脚本和JSONP请求,全局选项自动设置为false。更多关于这些方法的详细信息,请参阅下面的内容。
如果服务器需要HTTP认证,可以使用用户名和密码可以通过 username 和 password 选项来设置。
Ajax请求是限时的,所以错误警告被捕获并处理后,可以用来提升用户体验。请求超时这个参数通常就保留其默认值,要不就通过来全局设定,很少为特定的请求重新设置timeout选项。
默认情况下,请求总会被发出去,但浏览器有可能从他的缓存中调取数据。要禁止使用缓存的结果,可以设置cache参数为false。如果希望判断数据自从上次请求后没有更改过就报告出错的话,可以设置ifModified为true。
scriptCharset允许给&script&标签的请求设定一个特定的字符集,用于script 或者 jsonp类似的数据。当脚本和页面字符集不同时,这特别好用。
Ajax的第一个字母是“asynchronous”的开头字母,这意味着所有的操作都是并行的,完成的顺序没有前后关系。$.ajax()的async参数总是设置成true,这标志着在请求开始后,其他代码依然能够执行。强烈不建议把这个选项设置成false,这意味着所有的请求都不再是异步的了,这也会导致浏览器被锁死。
$.ajax()函数返回他创建的XMLHttpRequest对象。通常jQuery只在内部处理并创建这个对象,但用户也可以通过xhr 选项来传递一个自己创建的xhr对象。返回的对象通常已经被丢弃了,但依然提供一个底层接口来观察和操控请求。比如说,调用对象上的.abort() 可以在请求完成前挂起请求。
目前, 在Firefox中有一个bug,虽然.getResponseHeader('Content-Type')返回一个非空的字符串,但是 .getAllResponseHeaders()还是返回空字符串, 在Firefox中使用jQuery不支持自动解码JSON CORS 响应。
重写jQuery.ajaxSettings.xhr 的一种解决方案,如下
(function () {
var _super = jQuery.ajaxSettings.xhr,
xhrCorsHeaders = [ "Cache-Control", "Content-Language", "Content-Type", "Expires", "Last-Modified", "Pragma" ];
jQuery.ajaxSettings.xhr = function () {
var xhr = _super(),
getAllResponseHeaders = xhr.getAllResponseH
xhr.getAllResponseHeaders = function () {
var allHeaders = "";
allHeaders = getAllResponseHeaders.apply( xhr );
if ( allHeaders ) {
return allH
} catch ( e ) {
$.each( xhrCorsHeaders, function ( i, headerName ) {
if ( xhr.getResponseHeader( headerName ) ) {
allHeaders += headerName + ": " + xhr.getResponseHeader( headerName ) + "\n";
return allH
Extending Ajax(扩展 Ajax)
从jQuery 1.5开始,,jQuery的Ajax实现包括预, 和传输,让您更加灵活的扩展Ajax。如需有关这些先进功能的信息,请参阅
Using Converters(使用转换器)
$.ajax()的转换器支持的数据类型映射到其它数据类型。但是,如果你想把自定义数据类型映射到一个已知的类型(json等),您必须contents 选项在响应的Content-Type和实际的数据类型之间的添加一个相关的转换函数:
$.ajaxSetup({
contents: {
mycustomtype: /mycustomtype/
converters: {
"mycustomtype json": function ( result ) {
这额外的对象是必要的,因为响应内容类型(Content-Types)和数据类型从来没有一个严格的一对一对应关系(正则表达式表示结果)。
转换一个支持的类型(例如text, json)成自定义数据类型,然后再返回,使用另一个直通转换器:
$.ajaxSetup({
contents: {
mycustomtype: /mycustomtype/
converters: {
"text mycustomtype": true,
"mycustomtype json": function ( result ) {
现在上面的代码允许通过从text 为mycustomtype ,进而,mycustomtype 转换为 json。
Additional Notes:(其他注意事项:)
由于浏览器的安全限制,大多数“Ajax”的要求,均采用 ;该请求不能成功地检索来自不同的域,子域或协议的数据。
Script和JSONP形式请求不受同源策略的限制。
Example: 保存数据到服务器,成功时显示信息。
method: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }}).done(function( msg ) {
alert( "Data Saved: " + msg );});
Example: 装入一个 HTML 网页最新版本。
url: "test.html",
cache: false}).done(function( html ) {
$("#results").append(html);});
Example: 发送 XML 数据至服务器。设置 processData 选项为 false,防止自动转换数据格式。
var xmlDocument = [create xml document];var xmlRequest = $.ajax({
url: "page.php",
processData: false,
data: xmlDocument}); xmlRequest.done(handleResponse);
Example: 发送id作为数据发送到服务器,
保存一些数据到服务器上,
并通一旦它的完成知用户。
如果请求失败,则提醒用户。
var menuId = $("ul.nav").first().attr("id");var request = $.ajax({
url: "script.php",
method: "POST",
data: {id : menuId},
dataType: "html"}); request.done(function(msg) {
$("#log").html( msg );}); request.fail(function(jqXHR, textStatus) {
alert( "Request failed: " + textStatus );});
Example: 载入并执行一个JavaScript文件.
method: "GET",
url: "test.js",
dataType: "script"});}

我要回帖

更多关于 axure跨页面交互 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信