Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/joshgontijo/snappy
A tiny and powerful Java 8 server
https://github.com/joshgontijo/snappy
java-8 lambda rest-server server-sent-events undertow web-framework web-server websockets
Last synced: 12 days ago
JSON representation
A tiny and powerful Java 8 server
- Host: GitHub
- URL: https://github.com/joshgontijo/snappy
- Owner: joshgontijo
- License: apache-2.0
- Created: 2017-03-21T21:27:30.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2022-08-18T19:05:01.000Z (over 2 years ago)
- Last Synced: 2025-01-11T03:33:14.411Z (22 days ago)
- Topics: java-8, lambda, rest-server, server-sent-events, undertow, web-framework, web-server, websockets
- Language: JavaScript
- Homepage:
- Size: 3.45 MB
- Stars: 0
- Watchers: 2
- Forks: 1
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Snappy #
A tiny and powerful web framework for Java 8Features:
- Based on [Undertow](http://undertow.io) handlers
- Rest with content negotiation (media type only)
- Server sent events
- Server sent events client
- Websockets
- Websocket client
- Built in simple service discovery
- Small. ~6mb
- No magic, plain and simple
- Small memory footprint
- Static files
- Rest client
- Multipart support
- Executors and schedulers managed by the server
- Extensible
- Maven uber jar plugin using [Spring boot](https://projects.spring.io/spring-boot/)### Maven setup ###
```xml
io.joshworks.snappy
snappy
0.6.0
```### Import ###
```java
import static io.joshworks.snappy.SnappyServer.*;
import static io.joshworks.snappy.http.Response.*;
```### Hello ###
```java
public class App {public static void main(final String[] args) {
get("/hello", req -> ok("Hello !", "txt")); //or text/plain
start(); //9000
}
}
```### Path parameter ###
```java
public class App {public static void main(final String[] args) {
get("/hello/{name}", req -> ok("Hello " + req.pathParameter("name"), "txt"));
start();
}
}
```### Receiving JSON ###
```java
public class App {public static void main(final String[] args) {
post("/users", req -> {
User user = req.body().asObject(User.class);
//..
return ok();
});
start();
}
}
```### Sending JSON ###
```java
public class App {public static void main(final String[] args) {
get("/users", req -> ok(new User("John Doe")));
start();
}
}
```### Filter ###
```java
public class App {public static void main(final String[] args) {
beforeAll("/users", req -> System.out.println("A"));
before("/users", req -> System.out.println("B"));
after("/users", (req, res) -> System.out.println("C"));
afterAll("/users", (req, res) -> System.out.println("D"));
get("/users", req -> {
System.out.println("Users");
return ok();
});
start();
// Prints:
//A
//B
//Users
//C
//D
}
}
```### Error handling ###
```java
public class App {public static void main(final String[] args) {
exception(Exception.class, (ex, req) -> Response.internalServerError(ex));
get("/users", exchange -> {
throw new RuntimeException("Some error");
});
start();
}
}
```### Serving static files ###
```java
public class App {public static void main(final String[] args) {
//from src/main/resources/static
//available on /pages
staticFiles("/pages");
// staticFiles("/pages", "someFolder"); // src/main/resources/someFolder
}
}
```### Uploading file ###
```java
public class App {public static void main(final String[] args) {
post("/fileUpload", req -> {
Path theFile = req.multiPartBody("theFile").file().path();
Files.copy(theFile, someOutputStream);
});
}
}
```### Broadcasting data with SSE ###
```java
public class ClockServer {public static void main(final String[] args) {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();SseBroadcaster broadcaster = sse("/clock");
//curl http://localhost:9000/clockonStart(() -> scheduler.scheduleAtFixedRate(() -> broadcaster.broadcast(new Date().toString()), 1, 1, TimeUnit.SECONDS));
start();
}
}
```### SSE groups / topics ###
```java
public class App {public static void main(final String[] args) {
SseBroadcaster broadcaster = sse("/subscribe/{group}", sse -> {
sse.joinGroup(sse.pathParameter("group"));
});//curl http://localhost:9000/subscribe/group-a
//curl http://localhost:9000/subscribe/group-bpost("/publish/{group}", req -> {
String group = req.pathParameter("group");
String message = req.body().asString();
broadcaster.broadcast(group, message);
return ok();
});
}
}
```### Registering a parser ###
```java
public class App {public static void main(final String[] args) {
Parsers.register(myXmlParser);
get("/xml", req -> ok(""), produces("xml"));
}
}
```
### Resource group ###
```java
public class App {public static void main(String[] args) {
// /groupA/a
// /groupA/b
// /groupA/subgroup/c
group("/groupA", () -> {
get("/a", req -> {/* ... */});
put("/b", req -> {/* ... */});group("/subgroup", () -> {
get("/c", req -> {/* ... */});
});
});// /groupB/d
group("/groupB", () -> {
get("/d", req -> {/* ... */});
});
}
}
```### Uber jar ###
```xml${project.artifactId}
io.joshworks.snappy
snappy-maven-plugin
0.5.2
```