当前位置: 首页 > news >正文

如何建站网站头条号权重查询

如何建站网站,头条号权重查询,互联网保险产品有哪些,哪里可以接做ppt的网站restful和rest1.简介 到目前为止#xff0c;我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API#xff0c;扫视不同规格和可用性方面。 听起来好像支持超媒体和HATEOAS并不难#xff0c;只需选择您的收藏夹就可以了#xff01; … restful和rest 1.简介 到目前为止我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API扫视不同规格和可用性方面。 听起来好像支持超媒体和HATEOAS并不难只需选择您的收藏夹就可以了 您可能会猜到现实是“好取决于情况”在本教程的这一部分中我们将理解“为什么”。 困难的学习方法是从头开始设计和实现它们。 这正是我们将要忙的事情主要在Java中将RESTful Web API和客户端引入JVM平台。 我们将为其设计RESTful Web API的应用程序是我们之前涉及的案例研究的扩展版本。 从业务角度来看我们将实施一个可以让客户租车的租车平台。 我们的目标是根据REST架构风格的原则和约束来构建该平台。 目录 1.简介 2.从CRUD到工作流程 3.在服务器上 3.1。 JAX-RS 3.2。 QuarkusMicronautHelidon…… 3.3。 Crnk 3.4。 Spring帽子 3.5。 九头蛇 4.在客户端上 4.1。 JAX-RS 4.2。 Crnk 4.3。 Spring帽子 5。结论 6.接下来 7.下载源代码 2.从CRUD到工作流程 超媒体作为驱动力的存在极大地改变了设计过程。 不幸的事实是目前大多数基于HTTP的Web服务和API基本上都是CRUD代理用于其后面的数据存储。 仅仅公开数据模型并不能帮助客户理解他们可以做什么他们注定要在许多地方复制服务器的业务逻辑至少是业务逻辑的大部分。 这不是经过深思熟虑的REST应用程序应该做的。 REST API应该花费几乎所有的描述性精力来定义用于表示资源和驱动应用程序状态的媒体类型或者为现有标准媒体类型定义扩展关系名称和/或启用超文本的标记。 花费所有精力描述应该在媒体类型的处理规则范围内并且在大多数情况下已由现有媒体类型定义完全定义对感兴趣的URI使用哪种方法。 https://roy.gbiv.com/untangled/2008/rest-apis-must-be-超文本驱动 代替CRUD 我们应该将RESTful Web API视为工作流。 通过就适当的媒体类型达成共识服务器和客户端可以就如何解释它们达成共识。 链接关系和操作支付能力的存在会引导客户采取可能的后续步骤。 换句话说服务定义并共享供客户遵循的工作流。 3.在服务器上 在深入研究库和框架之前最好先了解我们正在尝试作为应用程序一部分构建的RESTful Web API的工作流程。 下图是这样做的尝试。 租车API工作流程 诚然工作流远非详尽无遗但足以说明现实世界中RESTful Web API的复杂性挑战和好处。 最后但并非最不重要的一点是我们尚未决定要使用哪种超媒体规范 。 HAL的简单性轻量级结构和广泛采用以及HAL-FORMS 使其成为大多数情况下的不错选择这就是我们将用于RESTful Web API的方式。 制定战略决策后就该讨论技术细节了。 首先我们正在寻找对我们有帮助的库或框架。 JAX-RS Jakarta RESTful Web服务规范更好地称为JAX-RS 2.1 JSR-370 是在JVM平台上实现RESTful Web服务和API的最受欢迎选择之一。 JAX-RS RESTful Web服务的Java API JAX-RS 是一种Java编程语言API规范它提供了根据代表性状态转移REST架构模式创建Web服务的支持。 https://projects.eclipse.org/projects/ee4j.jaxrs 尽管它包括全面的服务器端和客户端支持但除了引入非常基本的Link表示之外它几乎没有解决任何超媒体功能。 一些JAX-RS参考实现例如Jersey 进行了努力并捆绑了自己的专有扩展以促进对超媒体的支持但是正如您所期望的那样这些都不是规范的一部分。 这当然是有帮助的但仍然需要开发人员完成大量工作。 QuarkusMicronautHelidon…… 向微服务架构和云计算的加速转变导致了新一代的云原生框架的泛滥。 对于JVM平台尤其如此在JVM平台上著名的领导者正受到Quarkus Micronaut和Helidon等人的挑战。 实际上对于大多数媒体 而言 超媒体和HATEOAS并不是首要任务。 Micronaut是异常值的一个示例该异常值至少包含基本的超媒体元素 但总的来说您是一个人。 Crnk 如果您碰巧选择了JSONAPI规范来支持RESTful Web服务和API那么Crnk框架当然值得一看。 Crnk是JSON API规范和Java中建议的实现以促进构建RESTful应用程序。 它提供了许多可以使应用程序受益的约定和构造块。 这包括诸如排序过滤分页请求复杂对象图稀疏字段集将链接附加到数据或自动执行多项操作等功能。 与框架和库例如SpringCDIJPABean验证DropwizardServlet APIZipkin等的进一步集成可确保JSON API与Jav​​a生态系统完美地结合在一起。 https://github.com/crnk-project/crnk-framework Crnk采用以资源为中心的API建模方法基本上可以实现非常干净且可维护的实现。 引用文档 资源关系和存储库是Crnk的核心构建块。 下面的代码段很好地说明了这些概念。 JsonApiResource(type customer, resourcePath customers) public class Customer {JsonApiId private String id;NotNull NotBlank private String firstName;NotNull NotBlank private String lastName;JsonApiRelation(mappedBy customer)private CollectionReservation reservations;// Getters and setters here... }JsonApiResource(type reservation, resourcePath reservations) public class Reservation {JsonApiId private String id;private String vehicle;NotNull FutureOrPresent private LocalDate from;NotNull FutureOrPresent private LocalDate to;JsonApiRelation private Customer customer;// Getters and setters here... }Repository public class CustomerRepository implements ResourceRepositoryCustomer, String {// Implementation of the repository methods here... }Repository public class ReservationRepository implements ResourceRepositoryReservation, String {// Implementation of the repository methods here... } 基本上就是这样根据集成 Vert.X JAX-RS和Spring Boot Crnk框架将为您完成其余工作。 不幸的是 Crnk不支持ALPS或JSON Hyper-Schema 至少是开箱即用的。 但是由于我们决定使用HAL而不是JSONAPI 所以我们必须继续搜索。 Spring帽子 构成Spring产品组合的项目数量确实令人印象深刻。 我们特别感兴趣的是Spring HATEOAS 它是一个库用于支持实现超媒体驱动的RESTful Web服务和API的表示形式。 它实现了HAL HAL-FORMS Collection JSON和UBER规范并且加分了一点它带有ALPS支持非常适合我们完成已设定的目标。 如人们所料 Spring HATEOAS自然地与典型的Spring Boot Web应用程序集成包括传统的Spring MVC和响应式Spring WebFlux堆栈。 EnableHypermediaSupport批注以及Spring Boot自动配置功能会根据您选择的一个或多个规范来激活超媒体支持。 SpringBootConfiguration EnableHypermediaSupport(type HypermediaType.HAL_FORMS) public class ReservationServiceConfig {BeanHalFormsConfiguration halFormsConfiguration() {final HalFormsConfiguration configuration new HalFormsConfiguration();configuration.registerPattern(LocalDate.class, yyyy-MM-dd);return configuration;} } 遵循非正式的命名约定 RootController我们的RESTful Web API提供RootController 。 RestController public class RootController {GetMapping(/)public ResponseEntityRepresentationModel? root() {final RepresentationModel? model new RepresentationModel();model.add(linkTo(methodOn(RootController.class).root()).withSelfRel());model.add(templated(linkTo(methodOn(ReservationController.class).findAll(null)), reservations).withProfile(linkTo(methodOn(RootController.class).reservations()).withSelfRel().getHref()));model.add(linkTo(methodOn(CustomerController.class).findAll()).withRel(customers).withProfile(linkTo(methodOn(RootController.class).customers()).withSelfRel().getHref()));return ResponseEntity.ok(model);} } 控制器返回的HAL文档提示了下一个可用的导航方向。 { _links: { self: { href: https://rentals.jcg.com }, reservations: { href: https://rentals.jcg.com/reservations{?page,size,sort}, profile: https://rentals.jcg.com/alps/reservations, templated : true }, customers: { href: https://rentals.jcg.com/customers, profile: https://rentals.jcg.com/alps/customers } } } 有些事情可能引起您的注意。 第一个是reservations关系的链接该链接作为模板返回。 第二个是每个链接关系的profile属性的存在指向各自的ALPS配置文件。 下面的代码段说明了用于构建reservations收集资源的ALPS配置文件的Spring HATEOAS API。 GetMapping(value /alps/reservations, produces MediaTypes.ALPS_JSON_VALUE) public ResponseEntityAlps reservations() {return ResponseEntity.ok(Alps.alps().doc(doc().href(https://rentals.jcg.com/documentation.html).build()).descriptor(List.of(descriptor().id(reservations).type(Type.SEMANTIC).rt(#reservation).descriptor(Arrays.asList(descriptor().id(book).name(reservations).type(Type.UNSAFE).rt(#reservation).build(),descriptor().id(list).name(reservations).type(Type.SAFE).rt(#reservation).build())).build(),descriptor().id(reservation).type(Type.SEMANTIC).descriptor(Stream.concat(PropertyUtils.getExposedProperties(Reservation.class).stream().map(property - descriptor().id(property.getName()).href(href(property)) .type(Type.SEMANTIC).build()),Stream.of(descriptor().id(customer).type(Type.SAFE).rt(#customer).build(),descriptor().id(update).name(reservation).type(Type.IDEMPOTENT).rt(#reservation).build(),descriptor().id(cancel).name(reservation).type(Type.IDEMPOTENT).rt(#reservation).build())).collect(Collectors.toList())).build())).build()); } 分别是ALPS reservations集合资源概要文件的JSON表示这基本上是客户端要处理的内容。 {version: 1.0,doc: {href: https://rentals.jcg.com/documentation.html},descriptor: [ {id: reservations,type: SEMANTIC,descriptor: [ {id: book,name: reservations,type: UNSAFE,rt: #reservation}, {id: list,name: reservations,type: SAFE,rt: #reservation} ],rt: #reservation}, {id: reservation,type: SEMANTIC,descriptor: [ {id: from,href : https://schema.org/Date,type: SEMANTIC}, {id: id,href : https://schema.org/Thing#identifier,type: SEMANTIC}, {id: to,href : https://schema.org/Date,type: SEMANTIC}, {id: vehicle,href : https://schema.org/Vehicle#name,type: SEMANTIC}, {id: customer,type: SAFE,rt: #customer}, {id: update,name: reservation,type: IDEMPOTENT,rt: #reservation}, {id: cancel,name: reservation,type: IDEMPOTENT,rt: #reservation} ]} ] } 本着超媒体和HATEOAS的精神 Spring HATEOAS方法也是面向资源的或者更确切地说 面向资源表示的。 基本上您必须实现许多RepresentationModelAssembler 例如ReservationResourceAssembler 和控制器端点这些端点依赖于各自的汇编器来构造单个资源表示或资源集合表示。 Component public class ReservationResourceAssembler implements SimpleRepresentationModelAssemblerReservation {Overridepublic void addLinks(EntityModelReservation resource) {resource.add(linkTo(methodOn(CustomerController.class).findOne(resource.getContent().getCustomerId())).withRel(customer).withType(linkTo(methodOn(RootController.class).customers()).slash(#customer).toString()));resource.add(linkTo(methodOn(ReservationController.class).findOne(resource.getContent().getId())).withSelfRel().withType(linkTo(methodOn(RootController.class).reservations()).slash(#reservation).toString()).andAffordance(afford(methodOn(ReservationController.class).modify(resource.getContent().getId(), null))).andAffordance(afford(methodOn(ReservationController.class).cancel(resource.getContent().getId()))));} } 除了与customer的链接关系外还有许多用于更改预留资源状态 modify或cancel预留状态的优惠动作。 另外由于reservations收集资源正在使用分页和排序因此其表示的构造稍微复杂一点并且涉及两个汇编程序因此让我们看一下该示例。 RestController RequestMapping(path /reservations) public class ReservationController {Autowired private ReservationRepository repository;Autowired private ReservationResourceAssembler reservationResourceAssembler;Autowired private PagedResourcesAssemblerReservation assembler;GetMappingpublic ResponseEntityPagedModelEntityModelReservation findAll(PageableDefault Pageable pageable) {return ResponseEntity.ok(assembler.toModel(repository.findAll(pageable), reservationResourceAssembler));} } 为了演示分页的效果仅用说2个元素的页面大小来获取reservations集合就足够了。 { _embedded: { reservations: [ { id: 13e1892765c5, vehicle: Honda Civic 2020, from: 2020-01-01, to: 2020-01-05, _links: { customer: { href: https://rentals.jcg.com/customers/fed195a03e9d, type: https://rentals.jcg.com/alps/customers#customer }, self: { href: https://rentals.jcg.com/reservations/13e1892765c5, type: https://rentals.jcg.com/alps/reservations#reservation } }, _templates: { cancel: { method: delete, properties: [ ] }, default: { method: put, properties: [ { name: from, regex: yyyy-MM-dd, required: true }, { name: to, regex: yyyy-MM-dd, required: true }, { name: vehicle, required: true } ] } } }, { id: fc14e8ef90f5, vehicle: BMW 325i, from: 2020-01-10, to: 2020-01-12, _links: { customer: { href: https://rentals.jcg.com/customers/fed195a03e9d, type: https://rentals.jcg.com/alps/customers#customer }, self: { href: https://rentals.jcg.com/reservations/fc14e8ef90f5, type: https://rentals.jcg.com/alps/reservations#reservation } }, _templates: { cancel: { method: delete, properties: [ ] }, default: { method: put, properties: [ { name: from, regex: yyyy-MM-dd, required: true }, { name: to, regex: yyyy-MM-dd, required: true }, { name: vehicle, required: true } ] } } } ] }, _links: { first: { href: https://rentals.jcg.com/reservations?page0size2 }, self: { href: https://rentals.jcg.com/reservations?page0size2 }, next: { href: https://rentals.jcg.com/reservations?page1size2 }, last: { href: https://rentals.jcg.com/reservations?page1size2 } }, page: { size: 2, totalElements: 3, totalPages: 2, number: 0 } } 很容易发现附加的导航链接first next和last 它们实际上是上下文相关的例如由于我们要求第一页因此不存在prev链接关系。 可以肯定地说Spring HATEOAS为JVM平台提供了最全面的超媒体和HATEOAS支持。 尽管它没有立即实现某些规范但它允许通过一组SPI 插入自定义媒体类型 。 九头蛇 决定采用JSON-LD和Hydra的RESTful Web服务和API可能会受益于使用hydra-java库。 Spring HATEAOS扩展的出现非常令人鼓舞但不幸的是由于它不能与最新的Spring HATEOAS版本一起使用而被阴影掩盖 。 有了这个我们对RESTful Web服务和API的服务器端实现有了一个很好的主意现在该切换主题并讨论客户端。 4.在客户端上 从客户端角度区分超媒体 API客户端的两个角度或类是有意义的 Web用户界面前端上下文中的超媒体 API客户端 业务任务实施后端环境中的超媒体 API客户端 JavaScript是Web前端开发的第一选择而Java通常是JVM已经在后端方面占据了主导地位。 尽管我们将进一步讨论后者但许多概念同样适用于两者。 那么 超媒体 API客户端的设计和实现背后的原理是什么 如果要强调的是一件事那就是专注于针对超媒体规范进行编程而不是检查服务器的响应。 媒体类型应向客户提供所有必要的详细信息并作为实施指南。 而且客户可能只使用一些特定的流程而无需实现服务必须提供的所有功能。 JAX-RS JAX-RS 2.1规范包括客户端部分不幸的是该客户端部分仅提供了从Link头中提取链接的方法。 final Client client ClientBuilder.newClient();try (final Response response client.target(https://rentals.jcg.com/).request().accept(application/prs.hal-formsjson).get()) {final Link customers response.getLink(customers);if (customers ! null) {// follow the link here } } finally {client.close(); } 基本上与服务器端一样 如果您需要完成某些工作请准备好卷起袖子。 Crnk Crnk框架提供了很好的客户端支持并通过熟悉的构建块实现了这些构建块资源关系和存储库。 final CrnkClient client new CrnkClient(https://rentals.jcg.com/); client.setHttpAdapter(new OkHttpAdapter());final ResourceRepositoryCustomer, String repository client.getRepositoryForType(Customer.class);final ResourceRepositoryCustomer, String repository client.getRepositoryForType(Customer.class); final ListCustomer customers repository.findAll(new QuerySpec(Customer.class).setPaging(new OffsetLimitPagingSpec(0L, 10L)));if (!customers.isEmpty()) {// navigate through customers } 如果您的RESTful Web服务和API遵循JSONAPI规范则Crnk客户端可以为您节省大量时间和精力。 Spring帽子 令人惊讶的是直到最近SpringHATEOAS对超媒体客户端的支持还有些不完整但是最新版本带来了许多改进 。 Traverson是Spring HATEOAS支持的最古老的机制用于在链接和关系之间导航。 final RestTemplate template ...;final MapString, Object paging Map.of(page, 0L,size, 2L);final CollectionModelTypeReservation resourceType new TypeReferences.CollectionModelTypeReservation() {};final Traverson traverson new Traverson(URI.create(https://rentals.jcg.com/), MediaTypes.HAL_FORMS_JSON).setLinkDiscoverers(List.of(new HalFormsLinkDiscoverer())).setRestOperations(template);final CollectionModelReservation reservations traverson.follow(rel(reservations).withParameters(paging)).toObject(resourceType);;if (!reservations.getContent().isEmpty()) {// navigate through reservations } 像WebClient和RestTemplate这样的更传统的通用API客户端我们称它们为REST客户端也已经得到了超媒体支持。 final WebClient client builder.build();final CollectionModelTypeReservation resourceType new TypeReferences.CollectionModelTypeReservation() {}; final LinkDiscoverer discoverer new HalFormsLinkDiscoverer();final OptionalLink link client.get().uri(https://rentals.jcg.com/).accept(MediaTypes.HAL_FORMS_JSON).retrieve().bodyToMono(String.class).map(r - discoverer.findLinkWithRel(reservations, r)).block();if (link.isPresent()) {final MapString, Object paging Map.of(page, 0L,size, 2L);final URI uri link.get().getTemplate().expand(paging);final CollectionModelReservation reservations client.get().uri(uri).accept(MediaTypes.HAL_FORMS_JSON).retrieve().bodyToMono(resourceType).block();if (!reservations.getContent().isEmpty()) {// navigate through reservations} } 您甚至可以选择Traverson RestTemplate或WebClient 当然可以实现功能强大的超媒体 API客户端以完全自动化服务工作流程。 5。结论 在本教程的这一部分中我们讨论了可帮助您在JVM平台上设计和实现超媒体驱动的RESTful Web API及其客户端的库和框架。 尽管数量不多但您可以选择。 由于它主要是使用JavaScript在浏览器端完成的因此我们跳过了在Web前端上下文中有关超媒体 API客户端的讨论。 在这方面仍然值得一提的是Traverson 它是Node.js和浏览器的超媒体 API / HATEOAS客户端是的这是Spring HATEAOS的灵感来源。 6.接下来 在接下来的本教程的最后一部分我们将总结REST体系结构样式中最被遗忘和神秘的约束 超媒体作为应用程序状态引擎 HATEOAS 背后的理论和实践。 7.下载源代码 下载 您可以在此处下载此示例的完整源代码 具有HATEOAS的RESTful服务JVM上的REST API和超媒体 翻译自: https://www.javacodegeeks.com/restful-services-with-hateoas-rest-apis-and-hypermedia-on-jvm.htmlrestful和rest
http://www.sadfv.cn/news/182145/

相关文章:

  • 宁波市住房和城乡建设厅网站企业集团网站建设
  • 黄页推广软件网站wordpress 小公举
  • 外贸品牌网站制作怎么做自助购物网站
  • 给企业做网站怎么收钱备案成功的网站可以更换域名吗
  • .net网站开发步骤wordpress目录404
  • 南宁网站建设培训学校会计培训班多少钱
  • 上饶做网站建设类qq留言网站建设
  • 中信云 做网站大连信息网
  • 网站开发报告书武昌做网站哪家专业
  • 白领兼职做网站建设微信网站制作
  • 市场营销推广方案模板南昌seo全网营销
  • 大型门户网站建设企业南京本地网站
  • 建材网站建设案例短视频培训学校
  • 做的电影网站很卡免费高清logo图片在线生成
  • 国外网站 工信部备案郑州网站制作费用
  • 网站页面策划济南信息网
  • 广州中小学智慧阅读门户网站建设工程竣工规划局网站
  • 盐城网站建设价格高端品牌男鞋
  • 建设银行网站怎么基本转个人网站开发技术选型
  • 微信小程序网站建设方案杨家平网站建设
  • 做商业网站没有注册公司创建什么公司比较 好
  • 陕西省建设执业资格注册中心网站物流炒货怎么做网站
  • 南京高端网站制作做外贸如何建网站
  • 如何建设国外的网站国外的域名注册网站
  • 郑州网站公司创建网站有免费的吗
  • 惠阳营销网站制作网址升级中
  • 网站建设哪里比较好自己做小程序要钱吗
  • 江门医疗网站建设wordpress标签加入文章列表
  • 分销网站做视频采集网站犯法
  • 一个好的网站建设山东省城乡建设厅网站