上篇說了怎么用cxf發布restful webservice,由於瀏覽器只能對該service發送http的GET請求,所以如果想對服務器上的數據,還需要實現客戶端。
客戶端的實現方式有無數種。。。可以是.net,c++,還有很多java框架甚至socket。這里用cxf給的一個WebClient類來實現:
package com.client; import org.apache.cxf.jaxrs.client.WebClient; import com.DAO.Room; public class Client { static WebClient client; public static void main(String[] args) { client = WebClient.create("http://localhost:9999/"); put(); } static void get() { Room room = client.path("roomservice/room/001") .accept("application/xml").get(Room.class); System.out.println("get the room which id is:" + room.getId()); } static void post() { Room room = new Room(); room.setId("003"); client.path("roomservice/room").accept("application/xml") .post(room, Room.class); } static void delete() { client.path("roomservice/room/002").accept("application/xml").delete(); } static void put() { Room room = new Room(); room.setId("006"); client.path("roomservice/room/003").accept("application/xml").put(room); } }
這個類用起來很簡單,給WebClient的靜態方法create一個參數,該參數是服務器地址的字符串。
client.path("roomservice/room/001").accept("application/xml").get(Room.class);
這句代碼,是告訴client要訪問的restful資源,以及格式,最后的get,也就是對這個資源發送一個http GET請求,參數Room.class是告訴client要以什么方式接受服務器發送來的response。(服務器端和客戶端的格式應該一致,所以這里用的和服務器端用的是一個POJO,如果客戶端不是用CXF,那么應該定義一個scheme,這樣才能讓雙方明白來回發送的XML應該怎么處理,暫時也沒深入,回頭再研究。)
DELETE方法很好理解,就是把你指定的資源刪除掉,所以delete()不用帶參數。
POST,PUT方法有點不同,
post(Object body, Class<Room>)
put(Object body, Class<Room>)
第一參數是你要傳給服務器的POJO,第二個參數是告訴client要將server返回的response轉化為的POJO的類型。第二個參數可以不寫,如果不寫,收到的將是一個response。
調用這些操作后,可以通過http://localhost:9999/roomservice/room/ 查看結果。