之前的系列文章,为了测试一些功能点,所以只选择get这种情况,本文将添加另外三种主要的方法POST, PUT, DELETE.对应我们的业务方法是新增、修改、删除。此文对上篇文章示例代码进行修改。
首先在CustomerResource里加入代码:
@Override public boolean allowPut() { return true; } @Override public boolean allowPost() { return true; } @Override public boolean allowDelete() { return true; } @Override public void storeRepresentation(Representation entity) throws ResourceException { Form form = new Form(entity); Customer customer = new Customer(); customer.setName(form.getFirstValue("name")); customer.setRemarks("This is an example which receives request with put method and save data"); customerDAO.saveCustomer(customer); } @Override public void acceptRepresentation(Representation entity) throws ResourceException { Form form = new Form(entity); Customer customer = new Customer(); customer.setId(customerId); customer.setName(form.getFirstValue("name")); customer.setRemarks("This is an example which receives request with post method and update data"); customerDAO.updateCustomer(customer); } @Override public void removeRepresentations() throws ResourceException { customerDAO.deleteCustomer(customerId); }
这里稍微说明一下,如果你想增加put方法,则需要override方法allowPut,并使之返回值为true,同样,对post,delete是一样的,如果你觉得指定三个方法太多,那么你可以用下面的代码来替代上面三个方法:
@Override public boolean isModifiable() { return true; }
在数据层的接口类和实现类里面加入相应的调用代码:
public interface CustomerDAO { public String getCustomerById(String id); public void saveCustomer(Customer customer); public void updateCustomer(Customer customer); public void deleteCustomer(String id); }
public class CustomerDAOImpl implements CustomerDAO{ Logger logger = Logger.getLogger(this.getClass().getName()); public String getCustomerById(String id){ //get other information through id such as name, no, address etc. String name = "ajax"; String address= "Shanghai"; return "The customer name is " + name + " and he is from " + address; } public void saveCustomer(Customer customer){ //save the customer data into db System.out.println("save the infomation of customer into database"); } public void updateCustomer(Customer customer){ System.out.println("update the customer whose id is " + customer.getId()); } public void deleteCustomer(String id){ System.out.println("delete the customer whose id is " + id); } }
为了封装传递的参数,创建一个Customer BO:
public class Customer implements Serializable{ private static final long serialVersionUID = 4021273041291957638L; private String id; private String name; private String phone; private String address; private String email; private String remarks; //getter and setter method }
下面使用Restlet提供的客户端来测试上述代码:
public class CustomerResourceTest extends TestCase{ public static void testStoreRepresentation(){ Client client = new Client(Protocol.HTTP); Reference itemsUri = new Reference("http://localhost:8080/restlet/resources/customers/1"); Form form = new Form(); form.add("name", "Ajax"); form.add("description", "test store presentation"); Representation rep = form.getWebRepresentation(); Response response = client.put(itemsUri, rep); assertTrue(response.getStatus().isSuccess()); } public static void testAcceptRepresentation(){ Client client = new Client(Protocol.HTTP); Reference itemsUri = new Reference("http://localhost:8080/restlet/resources/customers/1"); Form form = new Form(); form.add("name", "Ajax_cn"); form.add("description", "test update presentation"); Representation rep = form.getWebRepresentation(); Response response = client.post(itemsUri, rep); assertTrue(response.getStatus().isSuccess()); } public static void testDeleteRepresentation(){ Client client = new Client(Protocol.HTTP); Reference itemsUri = new Reference("http://localhost:8080/restlet/resources/customers/1"); Response response = client.delete(itemsUri); assertTrue(response.getStatus().isSuccess()); } }
这里唯一想说的是看测试第一个方法里面的URL的定义:
Reference itemsUri = new Reference("http://localhost:8080/restlet/resources/customers/1");
按照资源的划分,这样的URL是不合适的,正确的URL应该是:
Reference itemsUri = new Reference("http://localhost:8080/restlet/resources/customers");相应的method是PUT。如果不是很理解,看这个系列中的一篇