RESTful Web Services - วิธีการ
ดังที่เราได้กล่าวไปแล้วว่าบริการเว็บ RESTful ใช้คำกริยา HTTP อย่างหนักเพื่อกำหนดการดำเนินการกับทรัพยากรที่ระบุ ตารางต่อไปนี้ระบุตัวอย่างการใช้คำกริยา HTTP ทั่วไป
วิธี HTTP | รับ |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users |
การดำเนินการ | รับรายชื่อผู้ใช้ |
ประเภทการทำงาน | อ่านเท่านั้น |
วิธี HTTP | รับ |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users / 1 |
การดำเนินการ | รับผู้ใช้ Id 1 |
ประเภทการทำงาน | อ่านเท่านั้น |
วิธี HTTP | โพสต์ |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users / 2 |
การดำเนินการ | แทรกผู้ใช้ด้วย Id 2 |
ประเภทการทำงาน | ไม่ระบุ |
วิธี HTTP | วาง |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users / 2 |
การดำเนินการ | อัปเดตผู้ใช้ด้วย Id 2 |
ประเภทการทำงาน | ไม่มี |
วิธี HTTP | ลบ |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users / 1 |
การดำเนินการ | ลบผู้ใช้ด้วย Id 1 |
ประเภทการทำงาน | Idempotent |
วิธี HTTP | ตัวเลือก |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users |
การดำเนินการ | แสดงรายการการดำเนินการที่รองรับในบริการเว็บ |
ประเภทการทำงาน | อ่านเท่านั้น |
วิธี HTTP | ศีรษะ |
---|---|
URI | http: // localhost: 8080 / UserManagement / rest / UserService / users |
การดำเนินการ | ส่งคืนเฉพาะส่วนหัว HTTP ไม่มีเนื้อหา |
ประเภทการทำงาน | อ่านเท่านั้น |
ประเด็นสำคัญที่ต้องพิจารณามีดังนี้
การดำเนินการ GET เป็นแบบอ่านอย่างเดียวและปลอดภัย
การดำเนินการ PUT และ DELETE ไม่ได้หมายความว่าผลลัพธ์จะเหมือนกันเสมอไม่ว่าการดำเนินการเหล่านี้จะถูกเรียกใช้กี่ครั้งก็ตาม
การดำเนินการ PUT และ POST นั้นใกล้เคียงกันโดยมีความแตกต่างที่แฝงอยู่ในผลลัพธ์เท่านั้นโดยที่การดำเนินการ PUT ไม่ได้มีศักยภาพและการดำเนินการ POST อาจทำให้เกิดผลลัพธ์ที่แตกต่างกัน
ตัวอย่าง
มาอัปเดตตัวอย่างที่สร้างในRESTful Web Services -บทช่วยสอนแอปพลิเคชันแรกเพื่อสร้างบริการเว็บที่สามารถดำเนินการ CRUD (สร้างอ่านอัปเดตลบ) เพื่อความง่ายเราได้ใช้ไฟล์ I / O เพื่อแทนที่การทำงานของฐานข้อมูล
อัปเดต UserService.java, User.java,UserDao.java ไฟล์ภายใต้แพ็คเกจ com.tutorialspoint
User.java
package com.tutorialspoint;
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String profession;
public User(){}
public User(int id, String name, String profession){
this.id = id;
this.name = name;
this.profession = profession;
}
public int getId() {
return id;
}
@XmlElement
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public String getProfession() {
return profession;
}
@XmlElement
public void setProfession(String profession) {
this.profession = profession;
}
@Override
public boolean equals(Object object){
if(object == null){
return false;
}else if(!(object instanceof User)){
return false;
}else {
User user = (User)object;
if(id == user.getId()
&& name.equals(user.getName())
&& profession.equals(user.getProfession())
){
return true;
}
}
return false;
}
}
UserDao.java
package com.tutorialspoint;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
public List<User> getAllUsers(){
List<User> userList = null;
try {
File file = new File("Users.dat");
if (!file.exists()) {
User user = new User(1, "Mahesh", "Teacher");
userList = new ArrayList<User>();
userList.add(user);
saveUserList(userList);
}
else{
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
userList = (List<User>) ois.readObject();
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return userList;
}
public User getUser(int id){
List<User> users = getAllUsers();
for(User user: users){
if(user.getId() == id){
return user;
}
}
return null;
}
public int addUser(User pUser){
List<User> userList = getAllUsers();
boolean userExists = false;
for(User user: userList){
if(user.getId() == pUser.getId()){
userExists = true;
break;
}
}
if(!userExists){
userList.add(pUser);
saveUserList(userList);
return 1;
}
return 0;
}
public int updateUser(User pUser){
List<User> userList = getAllUsers();
for(User user: userList){
if(user.getId() == pUser.getId()){
int index = userList.indexOf(user);
userList.set(index, pUser);
saveUserList(userList);
return 1;
}
}
return 0;
}
public int deleteUser(int id){
List<User> userList = getAllUsers();
for(User user: userList){
if(user.getId() == id){
int index = userList.indexOf(user);
userList.remove(index);
saveUserList(userList);
return 1;
}
}
return 0;
}
private void saveUserList(List<User> userList){
try {
File file = new File("Users.dat");
FileOutputStream fos;
fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(userList);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UserService.java
package com.tutorialspoint;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.OPTIONS;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
@Path("/UserService")
public class UserService {
UserDao userDao = new UserDao();
private static final String SUCCESS_RESULT="<result>success</result>";
private static final String FAILURE_RESULT="<result>failure</result>";
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
public List<User> getUsers(){
return userDao.getAllUsers();
}
@GET
@Path("/users/{userid}")
@Produces(MediaType.APPLICATION_XML)
public User getUser(@PathParam("userid") int userid){
return userDao.getUser(userid);
}
@POST
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String createUser(@FormParam("id") int id,
@FormParam("name") String name,
@FormParam("profession") String profession,
@Context HttpServletResponse servletResponse) throws IOException{
User user = new User(id, name, profession);
int result = userDao.addUser(user);
if(result == 1){
return SUCCESS_RESULT;
}
return FAILURE_RESULT;
}
@PUT
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String updateUser(@FormParam("id") int id,
@FormParam("name") String name,
@FormParam("profession") String profession,
@Context HttpServletResponse servletResponse) throws IOException{
User user = new User(id, name, profession);
int result = userDao.updateUser(user);
if(result == 1){
return SUCCESS_RESULT;
}
return FAILURE_RESULT;
}
@DELETE
@Path("/users/{userid}")
@Produces(MediaType.APPLICATION_XML)
public String deleteUser(@PathParam("userid") int userid){
int result = userDao.deleteUser(userid);
if(result == 1){
return SUCCESS_RESULT;
}
return FAILURE_RESULT;
}
@OPTIONS
@Path("/users")
@Produces(MediaType.APPLICATION_XML)
public String getSupportedOperations(){
return "<operations>GET, PUT, POST, DELETE</operations>";
}
}
ตอนนี้ใช้ Eclipse ส่งออกแอปพลิเคชันของคุณเป็นไฟล์ war และปรับใช้สิ่งเดียวกันใน tomcat ในการสร้างไฟล์ WAR โดยใช้ eclipse ให้ทำตามอ็อพชันFile -> export -> Web > War Fileและสุดท้ายเลือกโครงการ UserManagement และโฟลเดอร์ปลายทาง ในการปรับใช้ไฟล์สงครามใน Tomcat ให้วาง UserManagement.war ในTomcat Installation Directory > ไดเรกทอรี webapps และเริ่ม Tomcat
การทดสอบบริการเว็บ
Jersey มี API เพื่อสร้าง Web Service Client เพื่อทดสอบบริการบนเว็บ เราได้สร้างคลาสทดสอบตัวอย่างWebServiceTester.java ภายใต้แพ็คเกจ com.tutorialspoint ในโปรเจ็กต์เดียวกัน
WebServiceTester.java
package com.tutorialspoint;
import java.util.List;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
public class WebServiceTester {
private Client client;
private String REST_SERVICE_URL = "http://localhost:8080/UserManagement/rest/UserService/users";
private static final String SUCCESS_RESULT="<result>success</result>";
private static final String PASS = "pass";
private static final String FAIL = "fail";
private void init(){
this.client = ClientBuilder.newClient();
}
public static void main(String[] args){
WebServiceTester tester = new WebServiceTester();
//initialize the tester
tester.init();
//test get all users Web Service Method
tester.testGetAllUsers();
//test get user Web Service Method
tester.testGetUser();
//test update user Web Service Method
tester.testUpdateUser();
//test add user Web Service Method
tester.testAddUser();
//test delete user Web Service Method
tester.testDeleteUser();
}
//Test: Get list of all users
//Test: Check if list is not empty
private void testGetAllUsers(){
GenericType<List<User>> list = new GenericType<List<User>>() {};
List<User> users = client
.target(REST_SERVICE_URL)
.request(MediaType.APPLICATION_XML)
.get(list);
String result = PASS;
if(users.isEmpty()){
result = FAIL;
}
System.out.println("Test case name: testGetAllUsers, Result: " + result );
}
//Test: Get User of id 1
//Test: Check if user is same as sample user
private void testGetUser(){
User sampleUser = new User();
sampleUser.setId(1);
User user = client
.target(REST_SERVICE_URL)
.path("/{userid}")
.resolveTemplate("userid", 1)
.request(MediaType.APPLICATION_XML)
.get(User.class);
String result = FAIL;
if(sampleUser != null && sampleUser.getId() == user.getId()){
result = PASS;
}
System.out.println("Test case name: testGetUser, Result: " + result );
}
//Test: Update User of id 1
//Test: Check if result is success XML.
private void testUpdateUser(){
Form form = new Form();
form.param("id", "1");
form.param("name", "suresh");
form.param("profession", "clerk");
String callResult = client
.target(REST_SERVICE_URL)
.request(MediaType.APPLICATION_XML)
.put(Entity.entity(form,
MediaType.APPLICATION_FORM_URLENCODED_TYPE),
String.class);
String result = PASS;
if(!SUCCESS_RESULT.equals(callResult)){
result = FAIL;
}
System.out.println("Test case name: testUpdateUser, Result: " + result );
}
//Test: Add User of id 2
//Test: Check if result is success XML.
private void testAddUser(){
Form form = new Form();
form.param("id", "2");
form.param("name", "naresh");
form.param("profession", "clerk");
String callResult = client
.target(REST_SERVICE_URL)
.request(MediaType.APPLICATION_XML)
.post(Entity.entity(form,
MediaType.APPLICATION_FORM_URLENCODED_TYPE),
String.class);
String result = PASS;
if(!SUCCESS_RESULT.equals(callResult)){
result = FAIL;
}
System.out.println("Test case name: testAddUser, Result: " + result );
}
//Test: Delete User of id 2
//Test: Check if result is success XML.
private void testDeleteUser(){
String callResult = client
.target(REST_SERVICE_URL)
.path("/{userid}")
.resolveTemplate("userid", 2)
.request(MediaType.APPLICATION_XML)
.delete(String.class);
String result = PASS;
if(!SUCCESS_RESULT.equals(callResult)){
result = FAIL;
}
System.out.println("Test case name: testDeleteUser, Result: " + result );
}
}
ตอนนี้เรียกใช้เครื่องทดสอบโดยใช้ Eclipse คลิกขวาที่ไฟล์และทำตามตัวเลือกRun as -> Java Application. คุณจะเห็นผลลัพธ์ต่อไปนี้ในคอนโซล Eclipse:
Test case name: testGetAllUsers, Result: pass
Test case name: testGetUser, Result: pass
Test case name: testUpdateUser, Result: pass
Test case name: testAddUser, Result: pass
Test case name: testDeleteUser, Result: pass
พิมพ์