Skip to content

Dreampie/Resty

Repository files navigation

Resty một khoản cực giản restful nhẹ lượng cấp web dàn giáo

Đổi mới thuyết minh


  • feature/20170203 cường hóa Stringer công cụ cùng làm nhật ký duy trì màu sắc rực rỡ phát ra phương tiện khai phá giả điều chỉnh thử@t-baby

Join the chat at https://gitter.im/Dreampie/Resty Issue Stats Issue Stats Khai phá hồ sơ

Nếu ngươi còn không phải thực hiểu biết restful, hoặc là cho rằng restful chỉ là một loại quy phạm không có thực tế ý nghĩa, đề cử một thiên osc hai năm trước văn chương:RESTful API thiết kế tốt nhất thực tiễnCùng Infoq một thiên cực kỳ lý luận văn chươngLý giải nguồn gốc REST giá cấu phong cáchTuy rằng có điểm lão, giới thiệu cũng rất đơn giản, đại gia quyền đương hiểu biết, restful càng nhiều chỗ tốt, còn thỉnh google

Có được jfinal/activejdbc giống nhau activerecord ngắn gọn thiết kế, sử dụng càng đơn giản restful dàn giáo

restful api thiết kế, là làm restful phục vụ đoan tốt nhất lựa chọn ( sử dụng cảnh tượng: Bản cài đặt cùng phục vụ đoan giải ngó sen, dùng cho đối trạng thái tĩnh html bản cài đặt ( mvvm chờ ), ios, andriod chờ cung cấp phục vụ quả nhiên api tiếp lời )

Java khai phá chỉ nam:Java style guide

Api thiết kế chỉ nam:Http api design

Resty ví dụ:resty-samples( thuần tiếp lời )resty-demo( mang giao diện )

Nếu ngươi ở suy xét trước sau đoan chia lìa phương án, đề cử resty+vuejs,https://github /Dreampie/vuejs2-demo

Khai phá đàn:极简Restful框架 - Resty

Mặt khác khai phá giả cống hiến cắm kiện:Beetl mở rộng ( đại bàng )Shiro mở rộng (zhoulieqing) MongoPlugin(T-baby)

Có hứng thú cùng nhau giữ gìn nên dàn giáo, có thể liên hệ ta, tiến vào hợp tác khai phá

Quy phạm: Trước tiên thuyết minh công năng, tân kiến chi nhánhfeature/ ngàyCông năngfix/ ngàyChữa trị ở readme tăng thêm một cái TODO list miêu tả

  • feature/20161228 a task list item done@Dreampie
  • feature/20161229 a task list item todo@Dreampie

Chú ý số hiệu 2 cách súc tiến, cuối cùng sở hữu hợp tác giả cùng nhau số hiệu review, đủ tư cách lúc sau xác nhập đến master

maven sử dụng phương thức:

  1. Tăng thêm ỷ lại bao
<dependency>
<groupId>cn.dreampie</groupId>
<artifactId>resty-route</artifactId>
<version>1.3.1.SNAPSHOT</version>
</dependency>

2. Nếu sử dụng có chứa SNAPSHOT hậu tố bao, thỉnh tăng thêm nên kho hàng

<repositories>
<repository>
<id>oss-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

Một, độc hữu ưu điểm:

Trọng đại đổi mới:

1.3.0 đổi mới nội dung: Sử dụng jetty làm khảm nhập thức nhiệt thêm tái cam chịu thực hiện ( chỉ cần java văn kiện tiến hành biên dịch liền sẽ một lần nữa thêm tái ), resty-captcha nghiệm chứng mã công năng...

1.2.0 đổi mới nội dung: Sử dụng header tới khống chế api phiên bản, căn cứ vào số liệu nguyên đọc viết chia lìa, càng đơn giản tableSetting.Tình hình cụ thể và tỉ mỉ xem xét

1.1.0 phiên bản trọng đại đổi mới: Nhanh chóng tiếp nhập spring, hoãn tồn, mã hóa, header, XForwardedSupports chờ,Tình hình cụ thể và tỉ mỉ xem xét

Record thời đại đã đã đến, ngươi hoàn toàn không cần sử dụng bất luận cái gì model tới chấp hành ngươi số liệu

// sáng tạo record chấp hành khí nhằm vào sec_user biểu cũng mở ra hoãn tồn
RecordrecordDAO=newRecord("sec_user");
// sử dụng trước mặt số liệu nguyên cùng biểu số liệu new một cái đối tượng tới bảo tồn số liệu
recordDAO.reNew().set("Thuộc tính","Giá trị").save();
Recordr1=recordDAO.reNew().set("Thuộc tính","Giá trị");
Recordr2=recordDAO.reNew().set("Thuộc tính","Giá trị");
// phê lượng bảo tồn
recordDAO.save(r1,r2);
// đổi mới
r2.set("Thuộc tính","Giá trị").update()
// tuần tra toàn bộ
List<Record>records=recordDAO.findAll();
// điều kiện tuần tra
recordDAO.findBy(where,paras)
// phân trang tuần tra
Page<Record>records=recordDAO.paginateAll();
// căn cứ id xóa bỏ
recordDAO.deleteById("1");

// lần này tuần tra từ bỏ sử dụng cache
recordDAO.unCache().findBy(where,paras);
// đem record số liệu nguyên cắt đến dsmName số liệu nguyên thượng
recordDAO.useDS(dsmName).findBy(where,paras);

// từ từ, hoàn toàn thoát khỏi model, thực hiện nhanh chóng thao tác số liệu

Model duy trì động thái cắt số liệu nguyên cùng lần này tuần tra từ bỏ sử dụng cache

Userdao=newUser();
// lần này tuần tra từ bỏ sử dụng cache
dao.unCache().findBy(where,paras);
// đem model số liệu nguyên cắt đến dsmName số liệu nguyên thượng
dao.useDS(dsmName).findBy(where,paras);

// cơ sở dữ liệu cùng toàn cục tham số phối trí nhổ trồng đến application.properties tình hình cụ thể và tỉ mỉ xem thêm resty-example

#notmustautoload
app.encoding=UTF-8
app.devEnable=true
app.showRoute=false
app.cacheEnabled=true
# cam chịu sử dụngehcacheProvider
#app.cacheProvider=cn.dreampie.cache.redis.RedisProvider

##druidpluginautoload
db.default.url=jdbc:mysql://127.0.0.1/example?useUnicode=true&characterEncoding=UTF-8
db.default.user=dev
db.default.password=dev1010
db.default.dialect=mysql

#c3p0Phối trí
c3p0.default.minPoolSize=3
c3p0.default.maxPoolSize=20

#druidPhối trí
#druid.default.initialSize=10
#druid.default.maxPoolPreparedStatementPerConnectionSize=20
#druid.default.timeBetweenConnectErrorMillis=1000
#druid.default.filters=slf4j,stat,wall

#flywaydatabasemigrationautoload
flyway.default.valid.clean=true
flyway.default.migration.auto=true
flyway.default.migration.initOnMigrate=true


db.demo.url=jdbc:mysql://127.0.0.1/demo?useUnicode=true&characterEncoding=UTF-8
db.demo.user=dev
db.demo.password=dev1010
db.demo.dialect=mysql
#druid
druid.demo.initialSize=10
druid.demo.maxPoolPreparedStatementPerConnectionSize=20
druid.demo.timeBetweenConnectErrorMillis=1000
druid.demo.filters=slf4j,stat,wall
#flyway
flyway.demo.valid.clean=true
flyway.demo.migration.auto=true
flyway.demo.migration.initOnMigrate=true



// cơ sở dữ liệu phối trí tinh giản tự động từ văn kiện đọc lấy tham số chỉ cần phối trí model rà quét mục lục cùng dsmName
publicvoidconfigPlugin(PluginLoaderpluginLoader) {
// cái thứ nhất cơ sở dữ liệu
ActiveRecordPluginactiveRecordPlugin=newActiveRecordPlugin(newDruidDataSourceProvider("default"),true);
activeRecordPlugin.addIncludePaths("cn.dreampie.resource");
pluginLoader.add(activeRecordPlugin);
}

1. Cực giản route thiết kế, hoàn toàn dung nhập bình thường phương pháp phương thức, phương pháp tham số chính là thỉnh cầu tham số, phương pháp phản hồi giá trị chính là số liệu phản hồi giá trị

@GET("/users/:name")
// ở đường nhỏ trung tự định nghĩa phân tích tham số nếu có mặt khác phù hợp cũng có thể dùng /users/{name}
// tham số danh chính là phương pháp lượng biến đổi danh trừ đường nhỏ tham số ở ngoài tham số cũng có thể đặt ở phương pháp tham số truyền lại phương thức user={json tự phù xuyến }
publicMapfind(Stringname,Useruser) {
// return Lister.of(name);
returnMaper.of("k1","v1,name:"+name,"k2","v2");
// phản hồi cái gì số liệu trực tiếp return
}

2. Cực giản activerecord thiết kế, số liệu thao tác chỉ cần ngắn ngủn một hàng, duy trì phê lượng bảo tồn đối tượng

// phê lượng bảo tồn
Useru1=newUser().set("username","test").set("providername","test").set("password","123456");
Useru2=newUser().set("username","test").set("providername","test").set("password","123456");
User.dao.save(u1,u2);

// bình thường bảo tồn
Useru=newUser().set("username","test").set("providername","test").set("password","123456");
u.save();

// đổi mới
u.update();
// điều kiện đổi mới
User.dao.updateBy(columns,where,paras);
User.dao.updateAll(columns,paras);

// xóa bỏ
u.deleted();
// điều kiện xóa bỏ
User.dao.deleteBy(where,paras);
User.dao.deleteAll();

// tuần tra
User.dao.findById(id);
User.dao.findBy(where,paras);
User.dao.findAll();

// phân trang
User.dao.paginateBy(pageNumber,pageSize,where,paras);
User.dao.paginateAll(pageNumber,pageSize);

3. Cực giản bản cài đặt thiết kế, duy trì các loại thỉnh cầu, văn kiện thượng truyền cùng văn kiện download ( duy trì điểm tạm dừng tục truyền )

ClienthttpClient=null;// sáng tạo bản cài đặt đối tượng
// khởi động resty-example hạng mục, có thể thí nghiệm bản cài đặt
StringapiUrl="http://localhost:8081/api/v1.0";
// nếu không cần sử dụng tài khoản đổ bộ
//httpClient = new Client(apiUrl);
// nếu có tài khoản quyền hạn hạn chế yêu cầu đổ bộ
httpClient=newClient(apiUrl,"/tests/login","u","123");

// nên thỉnh cầu cần thiết đổ bộ lúc sau mới có thể phỏng vấn chưa đăng nhập khi phản hồi 401 chưa chứng thực
ClientRequestauthRequest=newClientRequest("/users");
ClientResultauthResult=httpClient.build(authRequest).get();
System.out.println(authResult.getResult());

//get
ClientRequestgetRequest=newClientRequest("/tests");
ClientResultgetResult=httpClient.build(getRequest).get();
System.out.println(getResult.getResult());

//post
ClientRequestpostRequest=newClientRequest("/tests");
postRequest.addParam("test",Jsoner.toJSONString(Maper.of("a","Ngạc ngạc")));
ClientResultpostResult=httpClient.build(postRequest).post();
System.out.println(postResult.getResult());

//put
ClientRequestputRequest=newClientRequest("/tests/x");
ClientResultputResult=httpClient.build(putRequest).put();
System.out.println(putResult.getResult());


//delete
ClientRequestdeleteRequest=newClientRequest("/tests/a");
ClientResultdeleteResult=httpClient.build(deleteRequest).delete();
System.out.println(deleteResult.getResult());


//upload
ClientRequestuploadRequest=newClientRequest("/tests/resty");
uploadRequest.addUploadFiles("resty",ClientTest.class.getResource("/resty.jar").getFile());
uploadRequest.addParam("des","test file paras thí nghiệm bút");
ClientResultuploadResult=httpClient.build(uploadRequest).post();
System.out.println(uploadResult.getResult());


//download duy trì điểm tạm dừng tục truyền
ClientRequestdownloadRequest=newClientRequest("/tests/file");
downloadRequest.setDownloadFile(ClientTest.class.getResource("/resty.jar").getFile().replace(".jar","x.jar"));
ClientResultdownloadResult=httpClient.build(downloadRequest).get();
System.out.println(downloadResult.getResult());

4. Duy trì nhiều số liệu nguyên cùng khảm bộ sự vụ ( sử dụng cảnh tượng: Yêu cầu phỏng vấn nhiều cơ sở dữ liệu ứng dụng, hoặc là làm công ty bên trong số liệu trung gian kiện hướng bản cài đặt cung cấp số liệu phỏng vấn api chờ )

// ở resource sử dụng sự vụ, cũng chính là controller, rest thế giới cho rằng cho nên thỉnh cầu đều tỏ vẻ tài nguyên, cho nên nơi này kêu resource
@GET("/users")
@Transaction(name= {"default","demo"})// nhiều số liệu nguyên sự vụ, nếu ngươi chỉ có một số liệu kho trực tiếp @Transaction không cần tham số
publicUsertransaction() {
//TODO dùng model chấp hành cơ sở dữ liệu thao tác chỉ cần có thao tác tung ra dị thường hai cái số liệu nguyên đều sẽ hồi lăn tuy rằng không phải phân bố thức sự vụ cũng có thể bảo đảm số hiệu khối số liệu chấp hành an toàn
}

// nếu ngươi yêu cầu ở service thực hiện sự vụ, thông qua java động thái đại lý ( cần thiết sử dụng tiếp lời, jdk thiết kế chính là như vậy )
publicinterfaceUserService{
@Transaction(name= {"demo"})//service tăng thêm nhiều số liệu nguyên sự vụ, nếu ngươi chỉ có một số liệu kho trực tiếp @Transaction không cần tham số
publicUsersave(Useru);
}
// ở resource sử dụng service tầng sự vụ
// @Transaction(name = { "demo" }) chú giải yêu cầu viết ở service tiếp lời thượng
// chú ý java tự động đại lý cần thiết tồn tại tiếp lời
// TransactionAspect là sự vụ mặt cắt, ngươi cũng có thể thực hiện chính mình mặt cắt tỷ như nhật ký Aspect, thực hiện Aspect tiếp lời
// lại private UserService userService = AspectFactory.newInstance(new UserServiceImpl(), new TransactionAspect(),new LogAspect());
privateUserServiceuserService=AspectFactory.newInstance(newUserServiceImpl(),newTransactionAspect());

5. Cực giản quyền hạn thiết kế, có thể thông qua cache duy trì phân bố thức session, ngươi chỉ cần thực hiện một cái đơn giản tiếp lời cùng tăng thêm một cái chặn lại khí, có thể thực hiện căn cứ vào url quyền hạn thiết kế

publicvoidconfigInterceptor(InterceptorLoaderinterceptorLoader) {
// quyền hạn chặn lại khí đặt ở đệ nhất vị trước tiên phán đoán tránh cho chấp hành không cần thiết số hiệu
interceptorLoader.add(newSecurityInterceptor(newMyAuthenticateService()));
}

// thực hiện tiếp lời
publicclassMyAuthenticateServiceimplementsAuthenticateService{
// đổ bộ khi thông qua name thu hoạch người dùng mật mã cùng quyền hạn tin tức
publicPrincipalfindByName(Stringname) {
DefaultPasswordServicedefaultPasswordService=newDefaultPasswordService();

Principalprincipal=newPrincipal(name,defaultPasswordService.hash("123"),newHashSet<String>() {{
add("api");
}});
returnprincipal;
}
// cơ sở quyền hạn tổng biểu cho nên url quyền hạn đều đặt ở nơi này ngươi có thể thông qua văn kiện hoặc là cơ sở dữ liệu hoặc là trực tiếp số hiệu tới thiết trí tất cả quyền hạn
publicSet<Credential>loadAllCredentials() {
Set<Credential>credentials=newHashSet<Credential>();
credentials.add(newCredential("GET","/api/v1.0/users**","users"));
returncredentials;
}
}

6. Cực giản hoãn tồn thiết kế, nhưng mở rộng, phi thường đơn giản có thể bắt đầu dùng model tự động hoãn tồn công năng

// bắt đầu dùng hoãn tồn cũng ở muốn tự động sử dụng hoãn tồn model thượng
//config application.properties app.cacheEnabled=true
// mở ra hoãn tồn @Table(name = "sec_user", cached = true)

@Table(name="sec_user",cached=true)
publicclassUserextendsModel<User> {
publicstaticUserdao=newUser();

}

7. Download văn kiện, chỉ cần trực tiếp return file

@GET("/files")
publicFilefile() {
returnnewFile(path);
}

8. Thượng truyền văn kiện, chú giải phối trí đem văn kiện viết đến server

@POST("/files")
@FILE(dir="/upload/")// phối trí thượng truyền văn kiện tương quan tin tức
publicUploadedFilefile(UploadedFilefile) {
returnfile;
}

9. Đương nhiên cũng là duy trì truyền thống web khai phá, ngươi có thể chính mình thực hiện số liệu phân tích, ở config tăng thêm tự định nghĩa phân tích khuôn mẫu

publicvoidconfigConstant(ConstantLoaderconstantLoader) {
// thông qua hậu tố tới phản hồi bất đồng số liệu loại hình ngươi có thể tự định nghĩa chính mình render như: FreemarkerRender
// cam chịu đã tăng thêm json cùng text duy trì, chỉ cần đem tự định nghĩa Render add có thể
// constantLoader.addRender( "json", new JsonRender());
}

Nhị, vận hành example thí dụ mẫu:

1. Ở bản địa mysql cơ sở dữ liệu sáng tạo demo,example cơ sở dữ liệu, đối ứng application.properties cơ sở dữ liệu phối trí

2. Vận hành resty-example hạ pom.xml->flyway-maven-plugin:migrate, tự động căn cụ resources hạ db mục lục hạ cơ sở dữ liệu văn kiện sinh thành cơ sở dữ liệu biểu kết cấu

3. Vận hành resty-example hạ pom.xml->tomcat6-maven-plugin:run, khởi động example trình tự

Nhắc nhở: Đề cử idea làm khai phá ide, sử dụng phân mô khối nhiều module khai phá

LicenseApache License V2

Quyên tặng: Alipay