最好的8個(gè)Java RESTful框架
過(guò)去的每一year,涌現(xiàn)出越來(lái)越多的Java框架。就像JavaScript,每個(gè)人都認(rèn)為他們知道一個(gè)好的框架的功能應(yīng)該是怎么樣的。連我的老祖母現(xiàn)在也使用 一個(gè)我從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)而且可能永遠(yuǎn)不會(huì)使用的框架。玩笑歸玩笑,可以做幾乎任何事的臃腫的框架市場(chǎng)已經(jīng)飽和,,但是如何評(píng)判呢?這篇文章旨在提供目前最好的 Java RESTfulful 框架。我只介紹輕量級(jí)的產(chǎn)品, 略過(guò)了那些臃腫的過(guò)度設(shè)計(jì)的框架。同時(shí),我只想要他們穩(wěn)定和成熟,提供簡(jiǎn)單,輕量級(jí)的特點(diǎn)。我只在介紹Play frameworks時(shí)打破這條規(guī)則,理由稍后給出。在將來(lái)的項(xiàng)目中使用哪個(gè) Java RESTful框架完全取決于你當(dāng)前的需求。為了便于你取舍,我將列出最突出的框架功能,希望這能節(jié)省一些你的時(shí)間。
Dropwizard
誕生時(shí)間: 2011
評(píng)分: 4.5/5
Dropwizard 提供了穩(wěn)定成熟的Java庫(kù), 并封裝成一個(gè)簡(jiǎn)單的輕量級(jí)的包。
Dropwizard 介于框架和庫(kù)之間。它提供了一個(gè)開(kāi)發(fā)web應(yīng)用程序的全部所需。由于內(nèi)置模塊化,一個(gè)應(yīng)用程序可以保持小而精干的特點(diǎn),減少開(kāi)發(fā)和維護(hù)的時(shí)間,減少負(fù)擔(dān)。
Dropwizard 使用已有的 Jetty HTTP 庫(kù),嵌入到你的項(xiàng)目中,無(wú)需外部的server。所有的Dropwizard項(xiàng)目都有一個(gè) main 方法來(lái)管理內(nèi)建的 HTTP server.
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
快速的項(xiàng)目構(gòu)建和啟動(dòng)
模塊化
不可思議的快(至少根據(jù)內(nèi)建的 metric 測(cè)得的結(jié)果)
Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON
也支持其它的庫(kù), 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, …
使用Metrics支持監(jiān)控
Main方法啟動(dòng) Jetty server,可以容易地調(diào)試和維護(hù)
社區(qū)力度強(qiáng)
缺點(diǎn)
Dropwizard文檔是主要的知識(shí)來(lái)源,但談不上優(yōu)秀。你可能需要搜索和發(fā)掘第三方類(lèi)庫(kù)的文檔。
因?yàn)槟承┰蝈e(cuò)誤被當(dāng)作普通文本, 如果你希望響應(yīng)結(jié)果總是JSON,這可能有問(wèn)題
確保使用最新的Dropwizard, 一些老版本使用了廢棄的第三方庫(kù)。 而且早期的Dropwizzard也很難升級(jí)
例子
package com.example.helloworld;
import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import com.example.helloworld.resources.HelloWorldResource;
import com.example.helloworld.health.TemplateHealthCheck;
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
@Override
public String getName() {
return "hello-world" ;
}
@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
// nothing to do yet
}
@Override
public void run(HelloWorldConfiguration configuration,
Environment environment) {
// nothing to do yet
}
}
注解
個(gè)人不想為大的項(xiàng)目推薦這個(gè)框架。不過(guò)如果你想嘗試的話,你不會(huì)失望的。主要是這個(gè)框架使用最好的現(xiàn)代的Java web 組件,組裝成一個(gè)簡(jiǎn)單易用的框架。
不幸的是這也帶來(lái)了它的問(wèn)題。 將這些庫(kù)糅合起來(lái)可能導(dǎo)致不可預(yù)見(jiàn)的問(wèn)題。這也是我為什么給它減掉0.5顆星,而沒(méi)有評(píng)為滿分5顆星。
Jersey
誕生時(shí)間: 2012 (Jersey 2.X)
評(píng)分: 5/5
Jersey RESTful 框架是開(kāi)源的RESTful框架, 實(shí)現(xiàn)了JAX-RS (JSR 311 & JSR 339) 規(guī)范。它擴(kuò)展了JAX-RS 實(shí)現(xiàn), 提供了更多的特性和工具, 可以進(jìn)一步地簡(jiǎn)化 RESTful service 和 client 開(kāi)發(fā)。盡管相對(duì)新怡,它已經(jīng)是一個(gè)產(chǎn)品級(jí)的 RESTful service 和 client 框架。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
優(yōu)秀的文檔和例子
快速
超級(jí)容易的路由
平滑的 JUnit 集成
就個(gè)人而言, 當(dāng)開(kāi)發(fā) RESTful service 時(shí), JAX-RS 實(shí)現(xiàn)要好于 MVC 框架。
可以集成到其它庫(kù)/框架 (Grizzly, Netty). 這也可能是很多產(chǎn)品使用它的原因。
支持異步鏈接
不喜歡 servlet container? 使用Jersey的時(shí)候可以不用它們。
WADL, XML/JSON support
包含在Glassfish中
缺點(diǎn)
Jersey 2.0+使用了有些復(fù)雜的依賴(lài)注入實(shí)現(xiàn)
可能不是一件壞事。Jersey 1.X 使用較老的 JAX-RS 實(shí)現(xiàn)
一大堆第三方庫(kù)只支持 Jersey 1.X, 在 Jersey 2.X 不可用
例子
package org.glassfish.jersey.examples.helloworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path ( "helloworld" )
public class HelloWorldResource {
public static final String CLICHED_MESSAGE = "Hello World!" ;
@GET
@Produces ( "text/plain" )
public String getHello() {
return CLICHED_MESSAGE;
}
}
注解
Jersey 是我的選擇, 5顆星。
Ninja Web Framework
誕生時(shí)間: 2012
評(píng)分: 3.5/5
Ninja Web Framework是全棧的 java web framework。穩(wěn)定, 快速, 可靠, 產(chǎn)品級(jí).
它提供了開(kāi)發(fā),測(cè)試,發(fā)布,維護(hù) RESTful web應(yīng)用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).
就像 DropWizzard, Ninja Web Framework 是一個(gè)集成的軟件棧。你不必建立你自己的,只需使用 Maven archetype生成一個(gè)新的項(xiàng)目,導(dǎo)入到IDE中就可以開(kāi)始編碼了。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
快
快速的項(xiàng)目構(gòu)建和啟動(dòng)
模塊化
XML, HTML, JSON渲染
也支持其它的庫(kù) (如 Guice, Logback, Guava, etc.)
很好的數(shù)據(jù)持久化和緩存
不喜歡 servlet container? U可以選擇你喜歡的容器
如果根本就不喜歡容器,可以使用 standalone 模式, 使用Jetty作為一個(gè)自執(zhí)行的jar
缺點(diǎn)
同樣,就像DropWizzard, 文檔有但是不夠好。我花了好長(zhǎng)時(shí)間去了解它。這個(gè)框架也依賴(lài)很多其它的庫(kù),有時(shí)候想得到所需的信息很麻煩。
不怎么出名,社區(qū)小。 有謠言說(shuō)這個(gè)框架是由那些切換到Scala的 Play 2.X 用戶創(chuàng)建的
例子
package controllers;
public class ApplicationController {
public Result index() {
Person person = new Person();
person.name = "John Johnson" ;
return Results.json().render(person);
}
}
注解
看起來(lái)不錯(cuò),但是在它成熟之前我還是把它丟在一邊吧。
Play Framework
誕生時(shí)間: 2011
評(píng)分: 4/5
使用Play Framework 很容易地創(chuàng)建,構(gòu)建和發(fā)布 web 應(yīng)用程序,支持 Java & Scala。它使用Akka, 基于一個(gè)輕量級(jí)的無(wú)狀態(tài)的架構(gòu)。它應(yīng)該應(yīng)用于大規(guī)模地低CPU和內(nèi)存消耗的應(yīng)用。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
易于開(kāi)發(fā)
快,但是沒(méi)有其它的一些框架快
基于 Netty, 支持非阻塞的 I/O. 并行處理遠(yuǎn)程調(diào)用的時(shí)候很優(yōu)秀
社區(qū)很大
快速的項(xiàng)目構(gòu)建和啟動(dòng)
模塊化
MVC
REST, JSON/XML, Web Sockets, non-blocking I/O
只需刷新瀏覽器就可以看到最新的改變
支持Async
有出版的書(shū)
缺點(diǎn)
版本2.0 是最有爭(zhēng)議的Java框架。 切換至Switch to Scala made some Java developers outraged.
不向后兼容; Play 2.X 重寫(xiě)了
號(hào)稱(chēng)輕量級(jí),但有些臃腫
SBT構(gòu)建工具. 號(hào)稱(chēng) Maven 殺手, 但是從沒(méi)有優(yōu)秀到替換它。難以學(xué)習(xí)和配置
非 servlet
Breaking changes across releases
例子
package controllers
import play.api._
import play.api.mvc._
class Application extends Controller {
def hello(name: String) = Action {
Ok( "Hello " + name + "!" )
}
}
注解
抱怨歸抱怨,我還是一直喜歡和首選這個(gè)框架。不幸的是,我只能給它4顆星。我堅(jiān)信 基于JAX-RS的框架更適合 RESTful web services.
RestExpress
誕生時(shí)間: 2009
評(píng)分: 3/5
RestExpress是一個(gè)非容器的輕量級(jí)的 Netty HTTP棧的包裝, 以便更容易地創(chuàng)建 Java RESTful services.
RestExpress 目標(biāo)是支持最好的 RESTful 實(shí)踐。
鏈接
GITHUB
優(yōu)點(diǎn)
真正的微框架
頂級(jí)的性能,快,可靠
XML/JSON
最老的也是最穩(wěn)定的 RESTful 框架之一
缺點(diǎn)
沒(méi)有文檔
幾乎沒(méi)有支持
很小的社區(qū)
例子
package com.example;
import java.io.IOException;
import io.netty.handler.codec.http.HttpMethod;
import org.restexpress.RestExpress;
public class Main
{
public static RestExpress startServer(String[] args) throws IOException
{
RestExpress server = new RestExpress();
MyResource r = new MyResource();
server.uri( "/myapp/myresource" , r)
.method(HttpMethod.GET)
.noSerialization();
server.uri( "/myapp/myresource" , r)
.method(HttpMethod.POST);
server.bind( 8080 );
return server;
}
public static void main(String[] args) throws Exception
{
RestExpress server = startServer(args);
System.out.println( "Hit enter to stop it..." );
System.in.read();
server.shutdown();
}
}
注解
盡管這個(gè)框架超級(jí)快,我也不想推薦它。文檔缺乏以及沒(méi)有支持使它成為一個(gè)欠佳的框架??丛谒俣鹊姆萆辖o它3顆星。
Restlet
誕生時(shí)間: 2005
評(píng)分: 4.5/5
Restlet 幫助Java程序員建立大規(guī)模的快速的符合 RESTful 架構(gòu)模式的web api。
它提供了強(qiáng)大的路由和 filtering 系統(tǒng)。統(tǒng)一的client/server Java API. 滿足所有主要的平臺(tái) (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了無(wú)數(shù)的擴(kuò)展以滿足程序員的需求。
據(jù)我說(shuō)知,它是第一個(gè) java RESTful web 框架。很多公司都在用它,但是你可能從未聽(tīng)說(shuō)過(guò)它,好像它已經(jīng)不可見(jiàn)了。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
強(qiáng)大
企業(yè)級(jí)的框架
多平臺(tái) Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments
支持JAX-RS (就像 Jersey)
大部分高級(jí) RESTful 支持
模塊化
支持其它庫(kù)
開(kāi)發(fā)一直活躍
智能的url綁定, 全功能的 URI 路由
有相關(guān)的書(shū)籍
缺點(diǎn)
非常陡峭的學(xué)習(xí)曲線
關(guān)閉的社區(qū),盡管 StackOverflow 上還是開(kāi)放的
不再流行,更多的是因?yàn)?Play Framework 和 Jersey
例子
public class Part03 extends ServerResource {
public static void main(String[] args) throws Exception {
// Create the HTTP server and listen on port 8182
new Server(Protocol.HTTP, 8182 , Part03. class ).start();
}
@Get ( "txt" )
public String toString() {
return "hello, world" ;
}
}
注解
盡管這個(gè)框架還一直流行,但到它的和當(dāng)前的完成度,我不能給它5顆星。
Restx
誕生時(shí)間: 2013
評(píng)分: 3.5/5
Restx 是一個(gè)輕量級(jí)的,模塊化的,特性眾多的,超快的開(kāi)源 Java REST 框架。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
快速,輕量級(jí)
容易搭建
真正的微框架
模塊化
支持其它庫(kù)
支持MongoDB
缺點(diǎn)
不友好的令人迷惑的文檔。對(duì)于這類(lèi)框架我期望能有好一點(diǎn)的文檔
太young
目前還不支持異步Async
例子
@GET ( "/message/{id}" )
public Message sayHello(String id, // path param
String who // query param
) {
return new Message().setMessage(String.format(
"hello %s, it's %s" ,
who, DateTime.now().toString( "HH:mm:ss" )));
}
@POST ( "/message/{id}" )
public Message sayHello(String id, // path param
Message msg // body param
) {
return msg.setMessage(String.format(
"%s @ %s" ,
msg.getMessage(), DateTime.now().toString( "HH:mm:ss" )));
}
注解
真心來(lái)講我沒(méi)有在這個(gè)框架上花費(fèi)太多時(shí)間。不值得在另一個(gè)框架上花費(fèi)太多精力,我意思是說(shuō),Java框架市場(chǎng)已經(jīng)越來(lái)越碎片化了,就像 JavaScript 市場(chǎng),應(yīng)該停止這種趨勢(shì)了。
Spark Framework
誕生時(shí)間: 2011
評(píng)分: 3.5/5
不要和 Apache 的大數(shù)據(jù)框架 Spark 弄混, 這里的 Spark 框架是一個(gè)輕量級(jí)的 Java web 框架,用來(lái)進(jìn)行快速的開(kāi)發(fā)(50% Spark用戶使用 Spark 創(chuàng)建 REST APIs)。 它受 Ruby 框架 Sinatra 啟發(fā)。
它有一個(gè)不到1M的最小化的內(nèi)核, 提供了所有基本的特性, 用來(lái)構(gòu)建 RESTful 或者傳統(tǒng)的 web 應(yīng)用程序。
鏈接
官方站點(diǎn) GITHUB 文檔
優(yōu)點(diǎn)
快,輕量級(jí)
優(yōu)秀的快速原型
易于搭建
經(jīng)常和AngularJS搭配使用
真正的微框架
使用 Jetty
可以用在容器中或者獨(dú)立運(yùn)行
缺點(diǎn)
文檔可以更好,它不適合初學(xué)者
不適合大型項(xiàng)目
社區(qū)小
例子
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get( "/hello" , (req, res) -> "Hello World" );
}
}
注解
這個(gè)框架適合初始開(kāi)發(fā)。主要用作小小項(xiàng)目或者原型。
- Java HttpClient-Restful工具各種請(qǐng)求高度封裝提煉及總結(jié)
- 一篇文章帶你搞懂Java restful 接口開(kāi)發(fā)
- Java Restful API的攔截詳解
- java調(diào)用Restful接口的三種方法
- Java進(jìn)階之走進(jìn)RESTful接口
- java使用Feign實(shí)現(xiàn)聲明式Restful風(fēng)格調(diào)用
- Java 調(diào)用Restful API接口的幾種方式(HTTPS)
- 淺談java調(diào)用Restful API接口的方式
- Restful之通用返回格式類(lèi)設(shè)計(jì)
相關(guān)文章
Java 執(zhí)行CMD命令或執(zhí)行BAT批處理方式
這篇文章主要介紹了Java 執(zhí)行CMD命令或執(zhí)行BAT批處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java實(shí)現(xiàn)簡(jiǎn)單的掃雷小程序
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的掃雷小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn'
這篇文章主要介紹了Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn't?exist問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Spring gateway配置Spring Security實(shí)現(xiàn)統(tǒng)一權(quán)限驗(yàn)證與授權(quán)示例源碼
這篇文章主要介紹了Spring gateway配置Spring Security實(shí)現(xiàn)統(tǒng)一權(quán)限驗(yàn)證與授權(quán),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法
這篇文章主要介紹了Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法,涉及java操作Excel文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Java使用正則表達(dá)式去除小數(shù)點(diǎn)后面多余的0功能示例
這篇文章主要介紹了Java使用正則表達(dá)式去除小數(shù)點(diǎn)后面多余的0功能,結(jié)合具體實(shí)例形式分析了java字符串正則替換相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
MyBatisPlus查詢報(bào)錯(cuò)Unknow?column?‘id‘?in?‘field?list‘解決分析
這篇文章主要為大家介紹了MyBatisPlus查詢報(bào)錯(cuò)Unknow?column?‘id‘?in?‘field?list‘解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java教程package和import訪問(wèn)控制的步驟詳解
這篇文章主要為大家介紹了Java教程package和import訪問(wèn)控制的步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

