ai人工智能写作网站,昆山高端网站建设,重庆建设人才网,哪个网站做民宿更好呢今天#xff0c;我们将就REST#xff08;ful#xff09;服务和API进行一次对话#xff0c;更准确地说#xff0c;围绕许多经验丰富的开发人员正在努力解决的一个独特主题。 为了使事情更直观#xff0c;我们将讨论Web API#xff0c;其中REST#xff08;ful#xff09… 今天我们将就RESTful服务和API进行一次对话更准确地说围绕许多经验丰富的开发人员正在努力解决的一个独特主题。 为了使事情更直观我们将讨论Web API其中RESTful原则遵循HTTP协议并大量利用HTTP方法的语义通常但不一定使用JSON表示状态。 一种特殊的HTTP方法非常引人注目尽管其含义听起来很简单但实现方法远非如此。 是的我们正在寻找您 PATCH 。 那到底是什么问题呢 这只是更新对不对 是的实质上在基于HTTP的RESTfulWeb服务的上下文中 PATCH方法的语义是资源的部分更新。 现在Java开发人员将如何做到这一点 这就是乐趣的开始。 让我们来看一个非常简单的图书管理API示例该示例使用最新的JSR 370RESTful Web服务的Java APIJAX-RS 2.1规范最终包括PATCH注释和出色的Apache CXF框架进行建模 。 我们的资源只是一个非常简单的Book类。 public class Book {private String title;private CollectionString authors;private String isbn;
} 您将如何使用PATCH方法实施部分更新 可悲的是强力解决方案即null宴席在这里显然是赢家。 PATCH
Path(/{isbn})
Consumes(MediaType.APPLICATION_JSON)
public void update(PathParam(isbn) String isbn, Book book) {final Book existing bookService.find(isbn).orElseThrow(NotFoundException::new);if (book.getTitle() ! null) {existing.setTitle(book.getTitle());}if (book.getAuthors() ! null) {existing.setAuthors(book.getAuthors());}// And here it goes on and on ...// ...
} 简而言之这是空保护的PUT克隆。 可能有人会声称这行得通并在这里宣布胜利。 但是希望对我们大多数人来说这种方法显然存在很多缺陷因此永远不应该采用。 备择方案 是的绝对是RFC-6902JSON补丁 目前还不是官方标准但已经实现了。 RFC-6902JSON修补程序通过表达一系列操作以应用于JSON文档从而彻底改变了游戏。 为了说明这一思想的实际效果让我们从更改书名的简单示例入手以所需的结果来描述。 { op: replace, path: /title, value: ... } 看起来很干净那么添加作者呢 简单 … { op: add, path: /authors, value: [..., ...] } 太棒了卖完了但是……从实现角度看这似乎需要很多工作不是吗 如果我们依赖最新和最强大的JSR 374JSON处理1.1的Java API它完全支持RFC-6902JSON Patch则不是真的。 有了合适的工具这次让我们做对了。 org.glassfishjavax.json1.1.2 有趣的是没有多少人知道Apache CXF和通常的任何JAX-RS兼容框架都与JSON-P紧密集成并支持其基本数据类型。 对于Apache CXF 只需添加cxf-rt-rs-extension-providers模块依赖项即可 org.apache.cxfcxf-rt-rs-extension-providers3.2.2 并在服务器工厂bean中注册JsrJsonpProvider 例如 Configuration
public class AppConfig {Beanpublic Server rsServer(Bus bus, BookRestService service) {JAXRSServerFactoryBean endpoint new JAXRSServerFactoryBean();endpoint.setBus(bus);endpoint.setAddress(/);endpoint.setServiceBean(service);endpoint.setProvider(new JsrJsonpProvider());return endpoint.create();}
} 将所有部分连接在一起我们的PATCH操作可以使用JSR 374仅用于JSON Processing 1.1的Java API来实现仅需几行 Service
Path(/catalog)
public class BookRestService {Inject private BookService bookService;Inject private BookConverter converter;PATCHPath(/{isbn})Consumes(MediaType.APPLICATION_JSON)public void apply(PathParam(isbn) String isbn, JsonArray operations) {final Book book bookService.find(isbn).orElseThrow(NotFoundException::new);final JsonPatch patch Json.createPatch(operations);final JsonObject result patch.apply(converter.toJson(book));bookService.update(isbn, converter.fromJson(result));}
} BookConverter执行Book类及其JSON表示之间的转换反之亦然我们正在手工进行操作以说明JSR 374JSON处理1.1的Java API提供的另一种功能。 Component
public class BookConverter {public Book fromJson(JsonObject json) {final Book book new Book();book.setTitle(json.getString(title));book.setIsbn(json.getString(isbn));book.setAuthors(json.getJsonArray(authors).stream().map(value - (JsonString)value).map(JsonString::getString).collect(Collectors.toList()));return book;}public JsonObject toJson(Book book) {return Json.createObjectBuilder().add(title, book.getTitle()).add(isbn, book.getIsbn()).add(authors, Json.createArrayBuilder(book.getAuthors())).build();}
} 最后让我们将这个简单的JAX-RS 2.1 Web API包装到漂亮的Spring Boot信封中。 SpringBootApplication
public class BookServerStarter { public static void main(String[] args) {SpringApplication.run(BookServerStarter.class, args);}
} 并运行它。 mvn spring-boot:run 结束讨论让我们通过在目录中故意添加一本不完整的书 来探讨一些更实际的例子。 $ curl -i -X POST http://localhost:19091/services/catalog -H Content-Type: application\json -d {title: Microservice Architecture,isbn: 978-1491956250,authors: [Ronnie Mitra,Matt McLarty]}HTTP/1.1 201 Created
Date: Tue, 20 Feb 2018 02:30:18 GMT
Location: http://localhost:19091/services/catalog/978-1491956250
Content-Length: 0 在本书的描述中我们要纠正一些错误即将标题设置为完整的“微服务体系结构原则实践和文化的 一致性 ” 并包括失踪的合著者Irakli Nadareishvili和Mike Amundsen 。 借助我们不久前开发的API这很容易。 $ curl -i -X PATCH http://localhost:19091/services/catalog/978-1491956250 -H Content-Type: application\json -d [{ op: add, path: /authors/0, value: Irakli Nadareishvili },{ op: add, path: /authors/-, value: Mike Amundsen },{ op: replace, path: /title, value: Microservice Architecture: Aligning Principles, Practices, and Culture }]HTTP/1.1 204 No Content
Date: Tue, 20 Feb 2018 02:38:48 GMT 前两个操作的路径引用可能看起来有些混乱但是不用担心让我们澄清一下。 因为authors是一个集合或就JSON数据类型而言是一个数组所以我们可以使用RFC-6902JSON Patch数组索引符号来指定要插入新元素的确切位置。 第一个操作使用索引0来表示头部位置而第二个操作使用-占位符来简化说“添加到集合的末尾”。 如果我们在更新后立即检索到该书则应该看到我们所做的修改完全按照我们的要求进行了应用。 $ curl http://localhost:19091/services/catalog/978-1491956250{title: Microservice Architecture: Aligning Principles, Practices, and Culture,isbn: 978-1491956250,authors: [Irakli Nadareishvili,Ronnie Mitra,Matt McLarty,Mike Amundsen]
} 干净简单而强大。 公平地说要付出代价是一种额外的JSON操作形式以应用补丁程序但是值得付出努力吗 我相信是…… 下次您要设计新颖的RESTfulWeb API时 请认真考虑RFC-6902JSON补丁以支持资源的PATCH实现。 我相信还将与JAX-RS进行更紧密的集成如果还没有的话以直接支持JSONPatch类及其家族。 最后但并非最不重要的一点是在本文中我们仅涉及服务器端实现但JSR 374用于JSON处理1.1的Java API也包括方便的客户端支架从而对补丁提供了完整的编程控制。 final JsonPatch patch Json.createPatchBuilder().add(/authors/0, Irakli Nadareishvili).add(/authors/-, Mike Amundsen).replace(/title, Microservice Architecture: Aligning Principles, Practices, and Culture).build(); 完整的项目资源可在Github上找到 。 翻译自: https://www.javacodegeeks.com/2018/02/run-away-null-checks-feast-patch-properly-json-patch.html