REST和JAX-RS知识介绍.doc_第1页
REST和JAX-RS知识介绍.doc_第2页
REST和JAX-RS知识介绍.doc_第3页
REST和JAX-RS知识介绍.doc_第4页
REST和JAX-RS知识介绍.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RESTREpresentationalStateTransfer;代表性状态传输、具象状态传输REST定义了应该如何正确地使用Web标准,例如HTTP和URI。REST并非标准,而是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。REST关键原则1、为所有“事物”定义ID含义:在Web中,代表ID的统一概念是:URI。URI构成了一个全局命名空间,使用URI标识你的关键资源意味着它们获得了一个唯一、全局的ID。使用URI标识所有值得标识的事物,特别是应用中提供的所有“高级”资源,无论这些资源代表单一数据项、数据项集合、虚拟亦或实际的对象还是计算结果等。好处:使用唯一、全局统一的命名规则的好处,既适用于浏览器中的Web应用,也适用于机对机(machine-to-machine,m2m)通信。2、将所有事物链接在一起含义:任何可能的情况下,使用链接指引可以被标识的事物(资源)。正式描述:“超媒体被当作应用状态引擎(Hypermedia as the engine of application state)”,有时简写为HATEOAS。这个描述的核心是超媒体概念,换句话说:是链接的思想好处:超媒体原则还有一个更重要的方面应用“状态”。简而言之,实际上服务器端为客户端提供一组链接,使客户端能通过链接将应用从一个状态改变为另一个状态。目前,只需要记住:链接是构成动态应用的非常有效的方式.htmlview plaincopyprint?1. 2. 233. 4. 5. 6. 7. 3、使用标准方法含义:浏览器知道如何去处理URI的原因在于所有的资源都支持同样的接口,一套同样的方法集合。标准方法集合包含GET、POSTPUT、DELETE、HEAD和OPTIONS为使客户端程序能与你的资源相互协作,资源应该正确地实现默认的应用协议(HTTP),也就是使用标准的GET、PUT、POST和DELETE方法。好处:它使你的应用成为Web的一部分应用程序为Web变成Internet上最成功的应用所做的贡献,与它添加到Web中的资源数量成比例。采用RESTful方式,一个应用可能会向Web中添加数以百万计的客户URI统一接口也使得所有理解HTTP应用协议的组件能与你的应用交互。通用客户程序(generic client)就是从中受益的组件的例子,例如curl、wget、代理、缓存、HTTP服务器、网关还有Google、Yahoo!、MSN等等。4、资源多重表述?含义:客户程序如何知道该怎样处理检索到的数据,比如作为GET或者POST请求的结果?原因是,HTTP采取的方式是允许数据处理和操作调用之间关系分离的。针对不同的需求提供资源多重表述好处:如果你为你的资源提供HTML和XML两种表述方式,那这些资源不仅可以被你的应用所用,还可以被任意标准Web浏览器所用5、无状态通信含义:REST要求状态要么被放入资源状态中,要么保存在客户端上。或者换句话说,服务器端不能保持除了单次请求之外的,任何与其通信的客户端的通信状态。这样做的最直接的理由就是可伸缩性 如果服务器需要保持客户端状态,那么大量的客户端交互会严重影响服务器的内存可用空间好处:无状态约束使服务器的变化对客户端是不可见的,因为在两次连续的请求中,客户端并不依赖于同一台服务器。JAX-RSJavaAPI forRESTful WebServices旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。是一个Java编程语言的应用程序接口,支持按照表象化状态转变 (REST)架构风格创建Web服务Web服务。与传统的 servlet 模型相比,JAX-RS 提供了一种可行的、更为简便、移植性更好的方式来在 Java 内实现 RESTful 服务。使用注释让您能够轻松提供 Java 资源的路径位置并将 Java 方法绑定到 HTTP 请求方法。一种可移植的数据绑定架构提供了一些本机的 Java 类型支持并允许进行序列化/反序列化处理的完全定制。javax.ws.rs.core.Application 子类的扩展以及 web.xml 内的相应清单表明了用最少的部署描述符配置就能进行轻松部署。JAX-RS 的具体实现由第三方提供,例如 Sun 的参考实现Jersey、Apache 的CXF以及 JBoss 的RESTEasy。JAX-RS标注JAX-RS提供了一些标注将一个资源类,一个POJO类,封装为Web资源。标注包括:Path,标注资源类或方法的相对路径GET,PUT,POST,DELETE,标注方法是用的HTTP请求的类型,分别对应 4 种 HTTP 方法,用于对资源进行创建、检索、更新和删除的操作。 若要创建资源,应该使用 POST 方法; 若要检索某个资源,应该使用 GET 方法; 若要更改资源状态或对其进行更新,应该使用 PUT 方法; 若要删除某个资源,应该使用 DELETE 方法。Produces,标注返回的MIME媒体类型Consumes,标注可接受请求的MIME媒体类型PathParam,QueryParam,HeaderParam,CookieParam,MatrixParam,FormParam,分别标注方法的参数来自于HTTP请求的不同位置, PathParam来自于URL的路径, QueryParam来自于URL的查询参数, HeaderParam来自于HTTP请求的头信息, CookieParam来自于HTTP请求的Cookie。Resource类和Resource方法Web 资源作为一个Resource 类来实现,对资源的请求由Resource 方法来处理。Resource 类或 Resource 方法被打上了 Path 标注,Path 标注的值是一个相对的 URI 路径,用于对资源进行定位,路径中可以包含任意的正则表达式以匹配资源。和大多数 JAX-RS 标注一样,Path 标注是可继承的,子类或实现类可以继承超类或接口中的 Path 标注。Resource 类是 POJO,使用 JAX-RS 标注来实现相应的 Web 资源。Resource 类分为根 Resource 类和子 Resource 类,区别在于子 Resource 类没有打在类上的 Path 标注。Resource 类的实例方法打上了Path 标注,则为Resource 方法或子 Resource 定位器,子 Resource 定位器上没有任何 GET、POST、PUT、DELETE 或者自定义的 HttpMethodjavaview plaincopyprint?1. Path(/)2. publicclassBookkeepingService3. .4. Path(/person/)/资源方法;若无POST,则为子资源定位器5. POST6. Consumes(application/json)7. publicResponsecreatePerson(Personperson)/JSON格式的请求体被自动映射为实体参数person8. .9. 10. 11. Path(/person/)12. PUT13. Consumes(application/json)14. publicResponseupdatePerson(Personperson)15. .16. 17. 18. Path(/person/id:d+/)/正则表达式19. DELETE20. publicResponsedeletePerson(PathParam(id)21. intid)22. .23. 24. 25. Path(/person/id:d+/)26. GET27. Produces(application/json)28. publicPersonreadPerson(PathParam(id)29. intid)30. .31. 32. 33. Path(/persons/)34. GET35. Produces(application/json)36. publicPersonreadAllPersons()/数组类型的返回值被自动映射为JSON格式的响应体?37. .38. 39. 40. Path(/person/name/)41. GET42. Produces(application/json)43. publicPersonreadPersonByName(PathParam(name)44. Stringname)45. .46. 注意:1. Subresources Locators是指一个指定了Path annotation,但未指定HttpMethod的annotation2. 最好是在一个interface中定义这个标注,然后实现这个interfaceResource方法参数类型、返回类型Resource 方法合法的参数类型包括:1. 原生类型在客户端如何发送原生类型?可否发送JSON类?2. 构造函数接收单个字符串参数,或者包含拥有一个static的valueOf(String)方法3. List,Set,SortedSet(T 为以上的 2 种类型)4. 用于映射请求体的实体参数Resource 方法合法的返回值类型包括:1. void:状态码 204 和空响应体2. Response:Response 的 status 属性指定了状态码,entity 属性映射为响应体javaview plaincopyprint?3.1. returnResponse.status(Status.OK).entity(JsonUtils.toString(result).build();1. GenericEntity:GenericEntity 的 entity 属性映射为响应体,entity 属性为空则状态码为 204,非空则状态码为 2002. 其它类型:返回的对象实例映射为响应体,实例为空则状态码为 204,非空则状态码为 200对于错误处理,Resource 方法可以抛出非受控异常 WebApplicationException 或者返回包含了适当的错误码集合的 Response 对象。内容协商与数据绑定Web 资源可以有不同的表现形式,服务端与客户端之间需要一种称为内容协商(Content Negotiation)的机制:作为服务端,Resource 方法的Produces标注用于指定响应体的数据格式(MIME 类型),Consumes标注用于指定请求体的数据格式;作为客户端,Accept请求头用于选择响应体的数据格式,Content-Type请求头用于标识请求体的数据格式。Produces=Accept?Consumes=Content-Type?服务端:Produces,Consumesjavaview plaincopyprint?1. GET2. Path(value=/emailAddress:.+.+.a-z+)3. Produces(value=text/xml,application/json)4. publicContactInfogetByEmailAddress(PathParam(value=emailAddress)5. StringemailAddress)6. .7. 8. 9. 10. POST11. Consumes(value=text/xml,application/json)12. publicvoidaddContactInfo(ContactInfocontactInfo)13. .14. 客户端AngularJS:Accept,Content-Type例如AngularJS发送请求:javascriptview plaincopyprint?1. $http(method:GET,url:/someUrl).2. success(function(data,status,headers,config)3. /thiscallbackwillbecalledasynchronously4. /whentheresponseisavailable5. ).6. error(function(data,status,headers,config)7. /calledasynchronouslyifanerroroccurs8. /orserverreturnsresponsewithanerrorstatus.9. );AngularJS Setting HTTP Headers默认的HTTP头:The$httpservice will automatically add certain HTTP headers to all requests. These defaultscan be fully configured by accessing the$httpProvider.defaults.headersconfigurationobject, which currently contains this default configuration: $httpPmon(headers that are common for all requests):o Accept: application/json, text/plain, * / *o X-Requested-With: XMLHttpRequest $httpProvider.defaults.headers.post: (header defaults for POST requests)o Content-Type: application/json $httpProvider.defaults.headers.put(header defaults for PUT requests)o Content-Type: application/json如何修改HTTP头:To add or overwrite these defaults, simply add or remove a property from these configuration objects. To add headers for an HTTP method other than POST or PUT, simply add a new objectwith the lowercased HTTP method name as the key, e.g.$httpProvider.defaults.headers.getMy-Header=value.Additionally, the defaults can be set at runtime via the$http.defaultsobject in the same fashion.e.g. 修改$httpProvider.defaults.headers(prevent angular.js $http object from sending X-Requested-With header)javascriptview plaincopyprint?1. angular.module(myModule,)2. .config($httpProvider,function($httpProvider)3. delete$httpPmonX-Requested-With4. )e.g. 使用$http.defaultsjavascriptview plaincopyprint?1. $http(2. method:POST,3. url:url,4. headers:Content-Type:application/x-www-form-urlencoded,/headers参数可以设置Accept、Content-Type5. ).success(function();Requests与Responses的序列化和反序列化服务端:实现MessageBodyWriter、MessageBodyReaderJAX-RS 依赖于 MessageBodyReader 和 MessageBodyWriter 的实现来自动完成返回值到响应体的序列化以及请求体到实体参数的反序列化工作,其中,XML 格式的请求响应数据与 Java 对象的自动绑定依赖于 JAXB 的实现。用户可以使用 Provider 标注来注册使用自定义的 MessageBodyProvider,如 清单 6 所示,GsonProvider 类使用了 Google Gson 作为 JSON 格式的 MessageBodyProvider 的实现。javaview plaincopyprint?1. Provider2. Produces(application/json)3. Consumes(application/json)4. publicclassGsonProviderimplementsMessageBodyWriter,5. MessageBodyReader6. 7. privatefinalGsongson;8. 9. publicGsonProvider()10. gson=newGsonBuilder().excludeFieldsWithoutExposeAnnotation().setDateFormat(11. yyyy-MM-dd).create();12. 13. 14. publicbooleanisReadable(Classtype,TypegenericType,Annotationannotations,15. MediaTypemediaType)16. returntrue;17. 18. 19. /MessageBodyReader.readFrom()20. publicObjectreadFrom(Classtype,TypegenericType,21. Annotationannotations,MediaTypemediaType,22. MultivaluedMaphttpHeaders,InputStreamentityStream)23. throwsIOException,WebApplicationException24. returngson.fromJson(newInputStreamReader(entityStream,UTF-8),type);25. 26. 27. publicbooleanisWriteable(Classtype,TypegenericType,Annotationannotations,28. MediaTypemediaType)29. returntrue;30. 31. 32. publiclonggetSize(Objectobj,Classtype,TypegenericType,33. Annotationannotations,MediaTypemediaType)34. return-1;35. 36. 37. /MessageBodyWriter.writeTo()38. publicvoidwriteTo(Objectobj,Classtype,TypegenericType,39. Annotationannotations,MediaTypemediaType,40. MultivaluedMaphttpHeaders,OutputStreamentityStream)41. throwsIOException,WebApplicationException42. entityStream.write(gson.toJson(obj,type).getBytes(UTF-8);43. 44. 45. 配置完成后,如何让它生效呢?可以通过扩展 javax.ws.rs.core.Application 类实现javaview plaincopyprint?1. publicclassContactInfoApplicaitonextendsApplication2. publicSetClassgetClasses()3. SetClassclasses=newHashSetSetClass();4. classes.add(ContactsResource.class);5. classes.add(ContactInfoWriter.class);6. classes.add(ContactInfoReader.class);7. 8. 9. publicSetSetObjectgetSingletons()10. /nothingtodo,nosingletons11. 12. 然后配置web.xmlhtmlview plaincopyprint?1. 2. 3. ContactInfoServlet4. com.sample.RESTSystemServlet5. 6. javax.ws.rs.Application7. 8. anization.ContactInfoApplication9. 10. 11. 12. 13. ContactInfoServlet14. /*15. 16. 客户端:$httpProvider.defaults.transformRequest/ResponseAngularJS Transforming Requests and ResponsesBoth requests and responses can be transformed using transform functions. By default, Angularapplies these transformations:Request transformations: If thedataproperty of the request configuration object contains an object,serialize it intoJSON format.Response transformations: If XSRF prefix is detected, strip it (see Security Considerations section below). If JSON response is detected,deserialize it using a JSON parser.To globally augment or override the default transforms, modify the$httpProvider.defaults.transformRequestand$httpProvider.defaults.transformResponseproperties. These properties are by default an array of transform functions, which allows you topushorunshifta new transformation function into the transformation chain. You can also decide to completely override any default transformations by assigning yourtransformation functions to these properties directly without the array wrapper.Similarly, tolocally override the request/response transforms, augment thetransformRequestand/ortransformResponseproperties of the configuration object passed into$http.e.g.local配置:在发送请求时设置transformRequest:javascriptview plaincopyprint?1. $http(2. method:POST,3. url:url,4. headers:Content-Type:application/x-www-form-urlencoded,5. transformRequest:function(obj)6. varstr=;7. for(varpinobj)8. str.push(encodeURIComponent(p)+=+encodeURIComponent(objp);9. returnstr.join(&);10. ,11. data:xsrf12. ).success(function();e.g.Global配置:$httpProvider.defaults.transformRequestjavascriptview plaincopyprint?1. varmodule=angular.module(myApp);2. 3. module.config(function($httpProvider)4. $httpProvider.d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论