In this post, I will be discussing about creating RESTful webservice in Java and in the next post will be discussing how to consume RESTful webservice we are about to create in Android application.php
Here is the quick overview of the JEE webapp which we are going to create:html
JEE webapp creation involves below steps:java
You can download source code from here if you don’t want to create Application from scratch, otherwise please proceed with below listings.web
Do follow below steps to create MySQL DB and Table.sql
Create MySQL DB and Table:chrome
Create database called ‘users’ in phpMyAdmin or create it through command:json
1
|
create
database
users
|
Select database users in phpMyAdmin or select it through command:restful
1
|
use
users
|
Create table called ‘user’ in phpMyAdmin or through command by pasting below SQL script in SQL Query box:
1
2
3
4
5
6
7
|
CREATE
TABLE
IF
NOT
EXISTS `
user
` (
`
name
`
varchar
(50)
NOT
NULL
,
`username`
varchar
(50)
NOT
NULL
,
`
password
`
varchar
(50)
NOT
NULL
,
`register_dt`
timestamp
NOT
NULL
DEFAULT
CURRENT_TIMESTAMP
,
PRIMARY
KEY
(`username`)
)
|
Am going to use Jersey framework to design RESTful webservice.
Reference: http://www.vogella.com/tutorials/REST/article.html#installation_jersey
Do follow the below steps to create RESTful webservice:
Goto https://jersey.java.net/download.html and download Jersey 1.18 ZIP bundle as shown below:Unzip the bundle, you can see list of Jars under lib folder as shown below:
Create Dynamic web project in Eclipse as shown below:Choose File>>New>>Dynamic Web Project
Enter project name as ‘useraccount’ and Click Finish
Register Jersey as Servlet dispatcher by adding below code into web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
=
"http://java.sun.com/xml/ns/javaee"
xmlns:web
=
"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation
=
"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id
=
"WebApp_ID"
version
=
"2.5"
>
<
display-name
>useraccount</
display-name
>
<
servlet
>
<
servlet-name
>Jersey REST Service</
servlet-name
>
<
servlet-class
>com.sun.jersey.spi.container.servlet.ServletContainer</
servlet-class
>
<
init-param
>
<
param-name
>com.sun.jersey.config.property.packages</
param-name
>
<
param-value
>com.prgguru.jersey</
param-value
>
</
init-param
>
<
load-on-startup
>1</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>Jersey REST Service</
servlet-name
>
<
url-pattern
>/*</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
|
Create a package called ‘com.prgguru.jersey’ under src folder
Create a class called ‘Constants.java’ under the package ‘com.prgguru.jersey’ and add below code to it:
Constants class holds application constants like DB class, DB username etc.,
Constants.java
1
2
3
4
5
6
7
8
9
|
package
com.prgguru.jersey;
//Change these parameters according to your DB
public
class
Constants {
public
static
String dbClass =
"com.mysql.jdbc.Driver"
;
private
static
String dbName=
"users"
;
public
static
String dbUser =
"root"
;
public
static
String dbPwd =
"password"
;
}
|
Create a class called ‘DBConnection.java’ under the package ‘com.prgguru.jersey’ and add below code to it:
DBConnection class performs DB related operations like Opening DB connection, Inserting records and Selecting records from Table.
DBConnection.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package
com.prgguru.jersey;
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.sql.Statement;
public
class
DBConnection {
/**
* Method to create DB Connection
*
* @return
* @throws Exception
*/
@SuppressWarnings
(
"finally"
)
public
static
Connection createConnection()
throws
Exception {
Connection con =
null
;
try
{
Class.forName(Constants.dbClass);
con = DriverManager.getConnection(Constants.dbUrl, Constants.dbUser, Constants.dbPwd);
}
catch
(Exception e) {
throw
e;
}
finally
{
return
con;
}
}
/**
* Method to check whether uname and pwd combination are correct
*
* @param uname
* @param pwd
* @return
* @throws Exception
*/
public
static
boolean
checkLogin(String uname, String pwd)
throws
Exception {
boolean
isUserAvailable =
false
;
Connection dbConn =
null
;
try
{
try
{
dbConn = DBConnection.createConnection();
}
catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Statement stmt = dbConn.createStatement();
String query =
"SELECT * FROM user WHERE username = '"
+ uname
+
"' AND password="
+
"'"
+ pwd +
"'"
;
//System.out.println(query);
ResultSet rs = stmt.executeQuery(query);
while
(rs.next()) {
//System.out.println(rs.getString(1) + rs.getString(2) + rs.getString(3));
isUserAvailable =
true
;
}
}
catch
(SQLException sqle) {
throw
sqle;
}
catch
(Exception e) {
// TODO Auto-generated catch block
if
(dbConn !=
null
) {
dbConn.close();
}
throw
e;
}
finally
{
if
(dbConn !=
null
) {
dbConn.close();
}
}
return
isUserAvailable;
}
/**
* Method to insert uname and pwd in DB
*
* @param name
* @param uname
* @param pwd
* @return
* @throws SQLException
* @throws Exception
*/
public
static
boolean
insertUser(String name, String uname, String pwd)
throws
SQLException, Exception {
boolean
insertStatus =
false
;
Connection dbConn =
null
;
try
{
try
{
dbConn = DBConnection.createConnection();
}
catch
(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Statement stmt = dbConn.createStatement();
String query =
"INSERT into user(name, username, password) values('"
+name+
"',"
+
"'"
+ uname +
"','"
+ pwd +
"')"
;
//System.out.println(query);
int
records = stmt.executeUpdate(query);
//System.out.println(records);
//When record is successfully inserted
if
(records >
0
) {
insertStatus =
true
;
}
}
catch
(SQLException sqle) {
//sqle.printStackTrace();
throw
sqle;
}
catch
(Exception e) {
//e.printStackTrace();
// TODO Auto-generated catch block
if
(dbConn !=
null
) {
dbConn.close();
}
throw
e;
}
finally
{
if
(dbConn !=
null
) {
dbConn.close();
}
}
return
insertStatus;
}
}
|
Create a class called ‘Utility.java’ under the package ‘com.prgguru.jersey’ and add below code to it:
Utility class has utility methods to perform Null check, contruct JSON etc.,
Utility.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
package
com.prgguru.jersey;
import
org.codehaus.jettison.json.JSONException;
import
org.codehaus.jettison.json.JSONObject;
public
class
Utitlity {
/**
* Null check Method
*
* @param txt
* @return
*/
public
static
boolean
isNotNull(String txt) {
// System.out.println("Inside isNotNull");
return
txt !=
null
&& txt.trim().length() >=
0
?
true
:
false
;
}
/**
* Method to construct JSON
*
* @param tag
* @param status
* @return
*/
public
static
String constructJSON(String tag,
boolean
status) {
JSONObject obj =
new
JSONObject();
try
{
obj.put(
"tag"
, tag);
obj.put(
"status"
,
new
Boolean(status));
}
catch
(JSONException e) {
// TODO Auto-generated catch block
}
return
obj.toString();
}
/**
* Method to construct JSON with Error Msg
*
* @param tag
* @param status
* @param err_msg
* @return
*/
public
static
String constructJSON(String tag,
boolean
status,String err_msg) {
JSONObject obj =
new
JSONObject();
try
{
obj.put(
"tag"
, tag);
obj.put(
"status"
,
new
Boolean(status));
obj.put(
"error_msg"
, err_msg);
}
catch
(JSONException e) {
// TODO Auto-generated catch block
}
return
obj.toString();
}
}
|
Create a class called Register.java under the package ‘com.prgguru.jersey’ and add below code to it.
Register class is the REST resource for registering the Users. User details sent from Android application will be inserted into DB after performing necessary checks.
Register.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package
com.prgguru.jersey;
import
java.sql.SQLException;
import
javax.ws.rs.GET;
import
javax.ws.rs.Path;
import
javax.ws.rs.Produces;
import
javax.ws.rs.QueryParam;
import
javax.ws.rs.core.MediaType;
//Path: http://localhost/<appln-folder-name>/register
@Path
(
"/register"
)
public
class
Register {
// HTTP Get Method
@GET
// Path: http://localhost/<appln-folder-name>/register/doregister
@Path
(
"/doregister"
)
// Produces JSON as response
@Produces
(MediaType.APPLICATION_JSON)
// Query parameters are parameters: http://localhost/<appln-folder-name>/register/doregister?name=pqrs&username=abc&password=xyz
public
String doLogin(
@QueryParam
(
"name"
) String name,
@QueryParam
(
"username"
) String uname,
@QueryParam
(
"password"
) String pwd){
String response =
""
;
//System.out.println("Inside doLogin "+uname+" "+pwd);
int
retCode = registerUser(name, uname, pwd);
if
(retCode ==
0
){
response = Utitlity.constructJSON(
"register"
,
true
);
}
else
if
(retCode ==
1
){
response = Utitlity.constructJSON(
"register"
,
false
,
"You are already registered"
);
}
else
if
(retCode ==
2
){
response = Utitlity.constructJSON(
"register"
,
false
,
"Special Characters are not allowed in Username and Password"
);
}
else
if
(retCode ==
3
){
response = Utitlity.constructJSON(
"register"
,
false
,
"Error occured"
);
}
return
response;
}
private
int
registerUser(String name, String uname, String pwd){
System.out.println(
"Inside checkCredentials"
);
int
result =
3
;
if
(Utitlity.isNotNull(uname) && Utitlity.isNotNull(pwd)){
try
{
if
(DBConnection.insertUser(name, uname, pwd)){
System.out.println(
"RegisterUSer if"
);
result =
0
;
}
}
catch
(SQLException sqle){
System.out.println(
"RegisterUSer catch sqle"
);
//When Primary key violation occurs that means user is already registered
if
(sqle.getErrorCode() ==
1062
){
result =
1
;
}
//When special characters are used in name,username or password
else
if
(sqle.getErrorCode() ==
1064
){
System.out.println(sqle.getErrorCode());
result =
2
;
}
}
catch
(Exception e) {
// TODO Auto-generated catch block
System.out.println(
"Inside checkCredentials catch e "
);
result =
3
;
}
}
else
{
System.out.println(
"Inside checkCredentials else"
);
result =
3
;
}
return
result;
}
}
|
Create a class called ‘Login.java’ under the package ‘com.prgugur.jersey’ and add below code to it.
Login class is the REST resource which authenticates the Users. It gets the User credentials sent from Android application through HTTP and authenticates whether the credential is valid or not.
Login.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package
com.prgguru.jersey;
import
javax.ws.rs.GET;
import
javax.ws.rs.Path;
import
javax.ws.rs.Produces;
import
javax.ws.rs.QueryParam;
import
javax.ws.rs.core.MediaType;
//Path: http://localhost/<appln-folder-name>/login
@Path
(
"/login"
)
public
class
Login {
// HTTP Get Method
@GET
// Path: http://localhost/<appln-folder-name>/login/dologin
@Path
(
"/dologin"
)
// Produces JSON as response
@Produces
(MediaType.APPLICATION_JSON)
// Query parameters are parameters: http://localhost/<appln-folder-name>/login/dologin?username=abc&password=xyz
public
String doLogin(
@QueryParam
(
"username"
) String uname,
@QueryParam
(
"password"
) String pwd){
String response =
""
;
if
(checkCredentials(uname, pwd)){
response = Utitlity.constructJSON(
"login"
,
true
);
}
else
{
response = Utitlity.constructJSON(
"login"
,
false
,
"Incorrect Email or Password"
);
}
return
response;
}
/**
* Method to check whether the entered credential is valid
*
* @param uname
* @param pwd
* @return
*/
private
boolean
checkCredentials(String uname, String pwd){
System.out.println(
"Inside checkCredentials"
);
boolean
result =
false
;
if
(Utitlity.isNotNull(uname) && Utitlity.isNotNull(pwd)){
try
{
result = DBConnection.checkLogin(uname, pwd);
//System.out.println("Inside checkCredentials try "+result);
}
catch
(Exception e) {
// TODO Auto-generated catch block
//System.out.println("Inside checkCredentials catch");
result =
false
;
}
}
else
{
//System.out.println("Inside checkCredentials else");
result =
false
;
}
return
result;
}
}
|
Deploy the web application:Right click on the project ‘useraccount’ >> Run As >> Run on Server
Here are the important annotations in Jersey.
Annotation | Description |
---|---|
@PATH(your_path) | Sets the path to base URL + /your_path. The base URL is based on your application name, the servlet and the URL pattern from the web.xml configuration file. |
@POST | Indicates that the following method will answer to an HTTP POST request. |
@GET | Indicates that the following method will answer to an HTTP GET request. |
@PUT | Indicates that the following method will answer to an HTTP PUT request. |
@DELETE | Indicates that the following method will answer to an HTTP DELETE request. |
@Produces(MediaType.TEXT_PLAIN[, more-types]) | @Produces defines which MIME type is delivered by a method annotated with @GET. In the example text (「text/plain」) is produced. Other examples would be 「application/xml」 or 「application/json」. |
@Consumes(type[, more-types]) | @Consumes defines which MIME type is consumed by this method. |
@PathParam | Used to inject values from the URL into a method parameter. This way you inject, for example, the ID of a resource into the method to get the correct object. |
Login.java
This class has a method called ‘doLogin’ which is the REST resource, that accepts query parameters as parameters and produce JSON as the response. Query parameters are Username and Password that are used for Authenticating the Users.
URL path to the method ‘dologin’ is illustrated in the below image:
Register.java
This class has a method called ‘doregister’ which is the REST resource, that accepts query parameters as parameters and produce JSON as the response.
URL path to the method ‘doregister’ is illustrated in the below image:
Chrome Advanced REST client extension provides an easy way to test the REST API. It provides lot of options like adding request headers, adding request parameters, changing HTTP method by hitting an url. Install Advanced REST clientextension in chrome browser and once you installed it you can find it in chrome Apps or an icon at the top right corner.
Registration
URL for registering the User is http://192.168.2.4:9999/useraccount/register/doregister?name=Admin&username=admin@programmerguru.com&password=password. Make sure you changed the IP address to your LAN IP address.
Logging in
URL for logging in the User is http://192.168.2.4:9999/useraccount/register/doregister?username=admin@programmerguru.com&password=password. Make sure you changed the IP address to your LAN IP address.