没有人愿意编写不良代码。 没有人会想到“我要创建最纠结和最不可读的代码,并确保它不可扩展且难以修改或浏览”,从而开始了应用程序开发。 首先要有良好的意愿,甚至可能要牢记所有Clean Code和SOLID原则。 但是,折衷方案通常以所涉及的外部依赖关系的数量为基础,开始快速蔓延和倍增。

令人羡慕的是,我们没有找到任何框架使我们能够开发Web应用程序,并良心宣称其业务逻辑不依赖于基础HTTP服务器,持久层或(反)序列化机制(也在DDD中称为“基础结构代码”)。

如果您也觉得自己不再开发应用程序,而是继续“集成”和“集成”框架,与它的恶魔抗争,并且从没有时间来使用实际的业务逻辑。 如果您还只是因为发布了新版本的框架而对无休止的重构感到厌倦。 如果您不确定要使用哪个批注,并且对使用的HTTP框架的入侵性感到坦白,那么HttpMate适合您。

它是非侵入性的,灵活的和超可扩展的。 HttpMate为您提供3种处理HTTP请求的模式-UseCase驱动的,低级HTTP和事件驱动的请求处理,以及混合这些模式以充分利用功能丰富的框架。

没有更多的理由,让我们看一些代码示例。

低级HTTP请求处理

final HttpMate httpMate = HttpMate.aLowLevelHttpMate().get("/api/hello", (httpRequest, httpResponse) -> {final Optional<String> name = httpRequest.queryParameters().getQueryParameter("name");httpResponse.setBody("Hello " + name.orElse("World"));httpResponse.setStatus(OK);}).build();

本文使用HttpMate的低级HTTP构建器,它只是探讨了可能性的表面。
您可以轻松地为任何path / http方法组合注册处理程序。 在处理程序lambda中,您可以使用请求和响应对象,处理程序可以根据需要变得复杂。
请查看存储库的示例部分,以获取有关低级API的更多信息。

您可能已经看到其他所有HTTP框架都提供了一种编写少量请求处理程序的简便方法,尽管这是介绍框架语法的好方法,也是一种出色的营销工具,但任何现实生活中的挑战都不仅仅是“只需通过函数调用处理请求”。 全世界都迫切需要一个HTTP框架,该框架将在请求处理和业务逻辑之间提供适当的抽象层,并允许您在重要的事情上不妥协-干净的体系结构和可扩展性。

UseCase示例

HttpMate允许您“仅将业务逻辑发布为HTTP端点”。 让我们探讨一下发送电子邮件以证明这一点的用例。

我们尚不知道HTTP端点的外观,但是我们知道我们需要一个Email对象来表示电子邮件的详细信息:

  • 发件人
  • 接收者
  • 学科
  • 身体

我们需要返回,假设每发送一封电子邮件都会有一个回执:

  • 追踪号码
  • 日期

并且我们有一个负责发送电子邮件的类,看起来像这样:

public class SendEmailUseCase {...public Receipt sendEmail(final Email email) { ...}...
}

现在,您已经可以使用HttpMate构建器来发布该用例-假设您已经决定了哪个URL和哪种HTTP方法将负责向用户提供此UseCase:

final HttpMate useCaseDrivenHttpMate = HttpMate.anHttpMateConfiguredAs(UseCaseDrivenBuilder.USE_CASE_DRIVEN).post("/api/sendEmail", SendEmailUseCase.class).mappingRequestsAndResponsesUsing(mapMate()...).build();

第一部分是不言自明的:在POST上调用SendEmailUseCase到“ / api / sendEmail”。

还有“ SendEmailUseCase怎么得到一个有效的Email实例?” 聪明的读者可能会问。

确实,这是一个有效的问题,它是此示例中最复杂的技术细节以及魔鬼隐藏的位置。 为了使本文的重点放在HttpMate上并使其易于阅读,我们要求另一位同伴与该魔鬼作斗争。 我们将在另一篇文章中谈论那个勇敢的伴侣。

默认情况下,HttpMate使用UseCase类的空默认构造函数对其进行初始化。 也就是说,通过向构建器添加调用,可以轻松地将HttpMate配置为使用任何依赖项注入机制。 以下示例演示了如何使用Google Guice:

final HttpMate useCaseDrivenHttpMate = HttpMate.anHttpMateConfiguredAs(UseCaseDrivenBuilder.USE_CASE_DRIVEN).post("/api/sendEmail", SendEmailUseCase.class).mappingRequestsAndResponsesUsing(mapMate()).configured(toCreateUseCaseInstancesUsing(INJECTOR::getInstance)).build();

查看此github存储库以获取SendEmailUseCase的更详细示例。

最后的话

有很多框架可以提供HTTP终结点配置,但是,大多数情况下,精美的演示无法经受住现实的考验。 我们希望创建一些既易于配置又可以直观地为您的应用程序开发提供支持的工具,为您提供完成干净的代码和体系结构的工具,并为您的用例奠定良好的基础。

不仅如此! 还记得我是如何告诉您的,这只是探索可能性的表面吗? HttpMate和我们正在研究的其他“伙伴”一起提供了更多功能:websocket,事件驱动的HTTP方法,正确完成多部分请求,处理请求和响应,验证序列化和反序列化等。请继续关注有关Mate的更多文章家庭!

我们很高兴听到您的反馈并收到您的贡献,因此请签出HttpMate和Happy Coding的GitHub存储库!

翻译自: https://www.javacodegeeks.com/2019/08/introducing-httpmate.html

HttpMate简介相关推荐

  1. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  2. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  3. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  4. TensorRT简介

    TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...

  5. 谷粒商城学习笔记——第一期:项目简介

    一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...

  6. 通俗易懂的Go协程的引入及GMP模型简介

    本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...

  7. Linux 交叉编译简介

    Linux 交叉编译简介 主机,目标,交叉编译器 主机与目标 编译器是将源代码转换为可执行代码的程序.像所有程序一样,编译器运行在特定类型的计算机上,输出的新程序也运行在特定类型的计算机上. 运行编译 ...

  8. TVM Operator Inventory (TOPI)简介

    TOPI简介 这是 TVM Operator Inventory (TOPI) 的介绍.TOPI 提供了比 TVM 具有更高抽象的 numpy 风格的,通用操作和调度.TOPI 如何在 TVM 中,编 ...

  9. 计算机视觉系列最新论文(附简介)

    计算机视觉系列最新论文(附简介) 目标检测 1. 综述:深度域适应目标检测标题:Deep Domain Adaptive Object Detection: a Survey作者:Wanyi Li, ...

最新文章

  1. Tomcat漏洞说明与安全加固
  2. Linux发行版上安装Netbeans IDE的各种方法
  3. ubuntu/Linux下 提示“conda:未找到命令”
  4. VTK:Shaders之SpatterShader
  5. JWT 实现微服务鉴权
  6. Javascript找出所有没有重复的字符(优化)
  7. 多传感器数据标定融合完整教程:时间同步+空间同步(Camera+Lidar+IMU+Radar)
  8. 安装8in1飞行模拟器过程
  9. 目标检测的图像特征提取之(二)LBP特征
  10. C语言stdio头文件常见的输入输出库函数
  11. 如何在JavaScript中用SpreadJS导入/导出Excel文件
  12. 墨刀导出的html可以修改,怎么把墨刀的原型复制出来
  13. 百度手机输入法 android ctrl,百度手机输入法旧版本
  14. 单个次序统计量的密度函数
  15. fHash(哈希校验工具)v2.1.9 绿色版
  16. P2708 硬币翻转——题解2020.10.11
  17. Android 跳转电话、邮件、短信等系统页面
  18. 不可错过的五款开源图形处理软件
  19. 一次简单的爬虫过程记录:静态网页小说下载
  20. 生命不息 减肥不止

热门文章

  1. 【贪心】逃跑(jzoj 1748)
  2. Lombok的@Data生成的hashCode和equals方法坑
  3. Redis 常用操作命令,非常详细
  4. 小菜:关于main方法的面试题
  5. java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一)
  6. Shell入门(十)之echo
  7. vue中父组件怎么调用子组件
  8. ArrayList如何对某个对象的日期属性排序?
  9. idea打war包时,JDK版本的问题解决方式
  10. EF框架中,在实体中手动更新字段,数据库数据未同步到程序中应该怎么解决呢?