Endpoint: HTTP Get¶
Our first task is simple:
If client access SERVER_URL/courses
, it will Get a list of courses. Note that SERVER_URL
for now is port 7000
on localhost (http://127.0.0.1:7000/
) on your computer.
Here is a starting point:
1 2 3 4 5 6 | public static void main(String[] args) { Javalin app = Javalin.create().start(7000); app.get("/", ctx -> ctx.result("Welcome to CourseReVU App")); // TODO: update the code below to actually show a list of courses! app.get("/courses", ctx -> ctx.result("List of books")); } |
We will use JSON to transfer data between server and client so "the list of courses" will be a JSON Array.
Get set up!¶
In addition to starting the (local) server we must (create and) initialize a database with Courses
table. We further need to hook that database to our Data Access Objects (i.e. CourseDao
here):
1 2 3 4 5 6 7 8 9 10 | public static void main(String[] args) { // Preparation! Sql2o sql2o = getSql2o(); createTable(sql2o); CourseDao courseDao = getCourseDao(sql2o); initData(courseDao); Javalin app = startServer(); app.get("/", ctx -> ctx.result("Welcome to CourseReVU App")); } |
Here is the helper method to start the server:
1 2 3 4 | private static Javalin startServer() { final int PORT = 7000; return Javalin.create().start(PORT); } |
Here is a helper method to create a Sql2o
object.
1 2 3 4 5 6 | private static Sql2o getSql2o() { final String URI = "jdbc:sqlite:./Store.db"; final String USERNAME = ""; final String PASSWORD = ""; return new Sql2o(URI, USERNAME, PASSWORD); } |
We will pass the Sql2o
object to this helper method to create the Courses
table for us.
1 2 3 4 5 6 7 8 9 10 11 | private static void createCoursesTable(Sql2o sql2o) { dropCoursesTableIfExists(sql2o); String sql = "CREATE TABLE IF NOT EXISTS Courses(" + "id INTEGER PRIMARY KEY," + "name VARCHAR(30) NOT NULL," + "url VARCHAR(100)" + ");"; try (Connection conn = sql2o.open()) { conn.createQuery(sql).executeUpdate(); } } |
Note the createCoursesTable
calls dropCoursesTableIfExists
helper method:
1 2 3 4 5 6 | private static void dropCoursesTableIfExists(Sql2o sql2o) { String sql = "DROP TABLE IF EXISTS Courses;"; try (Connection conn = sql2o.open()) { conn.createQuery(sql).executeUpdate(); } } |
The following helper method takes in a Sql2o
and returns a CourseDao
:
1 2 3 | private static CourseDao getCourseDao(Sql2o sql2o) { return new Sql2oCourseDao(sql2o); } |
Now we can use a CourseDao
object to add some sample data:
1 2 3 4 | private static void initData(CourseDao courseDao){ courseDao.add(new Course("oose", "jhu-oose.com")); courseDao.add(new Course("Intro os", "jhu-os.com")); } |
courses
endpoint¶
Returning a list of courses is as easy as follows:
1 2 3 4 5 6 | app.get("/courses", ctx -> { List<Course> courseList = courseDao.findAll(); ctx.json(courseList); ctx.contentType("application/json"); ctx.status(200); }); |
ctx.json(courseList);
converts the course list into a JSON Array and sends it back as the response.ctx.contentType("application/json");
specifies the type of content that response contains is JSON.ctx.status(200);
specifies the process was successful.
Status | Meaning |
---|---|
200 (OK) | This is the standard response for successful HTTP requests. |
201 (CREATED) | This is the standard response for an HTTP request that resulted in an item being successfully created. |
204 (NO CONTENT) | This is the standard response for successful HTTP requests, where nothing is being returned in the response body. |
400 (BAD REQUEST) | The request cannot be processed because of bad request syntax, excessive size, or another client error. |
403 (FORBIDDEN) | The client does not have permission to access this resource. |
404 (NOT FOUND) | The resource could not be found at this time. It is possible it was deleted, or does not exist yet. |
500 (INTERNAL SERVER ERROR) | The generic answer for an unexpected failure if there is no more specific information available. |
Note
Javalin uses Jackson JSON parser to convert objects to JSON and vise-versa. I recommend using Google's Gson instead.
To add Gson
to your project dependency, add the following to dependencies
block of build.gradle
:
1 | implementation 'com.google.code.gson:gson:2.8.6' |
To have Javalin use Gson
, update the startServer
method as follows:
1 2 3 4 5 6 7 | private static Javalin startServer() { Gson gson = new GsonBuilder().create(); JavalinJson.setFromJsonMapper(gson::fromJson); JavalinJson.setToJsonMapper(gson::toJson); final int PORT = 7000; return Javalin.create().start(PORT); } |
If you run the application and point your browser to http://127.0.0.1:7000/courses
, you must see the following in your browser:
1 | [{"id":1,"name":"oose","url":"jhu-oose.com"},{"id":2,"name":"Intro os","url":"jhu-os.com"}] |
Tip
You can use a Chrome Extension like JSON Formatter to prettify the output into a more readable one.