替代Jersey的超輕量RESTful框架—SlwRest(Super Lightweight Rest)

    Jersey升級後,變化很大,越來越重,Bug也較多,漸漸與rest輕量化理念背道而弛。由於項目需要實現了一超輕量RESTful框架—SlwRest(Super Lightweight),一個Rest框架分服務端與客戶端兩部分,框架小於100K。

客戶端:應該是簡潔高效的。

服務端:應該是簡潔標準的。應該是對JSR311-API規範進行實現,JSR311是java中實現Restful Web Service的API規範(JSR311: JAX-RS: The Java API for RESTful Web Services)。JSR311通過使用註解(annotation)把POJO暴露成Web Service,達到輕量化。

  核心功能:

  • RequestMethod支持GET, POST, DELETE, PUT
  • 參數獲取支持 @FormParam, @PathParam, @QueryParam, @HeaderParam等
  • 內容支持常用的JSON, XML, TEXT
  • 能夠方便地實現Java複雜對象, List, Map對象與JSON/XML的互轉換 
  • 支持多文件、多參數上傳,支持文件下載

客戶端代碼

創建RestClient對象

private static String serverUri = "http://localhost:8080/slwRestServer/rest/users";
private static RestClient client = new RestClient();

    GET

private void getUser(String id) {
    RestRequest request = new RestRequest(serverUri + "/user");
    request.addParams("id", id);
    RestResponse response = client.get(request);
    SlwUser user = response.readEntity(SlwUser.class);
}

POST

private void addUser(SlwUser user) {
    String json = SlwJson.toJSON(user);
    RestRequest request = new RestRequest(serverUri);
    RestResponse response = client.postJson(request, json);
    System.out.println(response.getStatus());
}

PUT

private void updateUser(SlwUser user) {
    String json = SlwJson.toJSON(user);
    RestRequest request = new RestRequest(serverUri);
    RestResponse response = client.putJson(request, json);
    System.out.println(response.getStatus());
}

DELETE

private void delUser(String id) {
    RestRequest request = new RestRequest(serverUri + "/" + id);
    RestResponse response = client.delete(request);
    System.out.println(response.getStatus());
}

上傳

private void upload() {
    System.out.println("****多文件、多參數****");

    RestRequest request = new RestRequest(serverUri + "/upload");
    request.addParams("username", "Weidong");
    request.addFiles("file1", new File("files/upload/1.jpg"));
    request.addFiles("file2", new File("files/upload/2.jpg"));
    request.addFiles("file3", new File("files/upload/3.jpg"));
	
    RestResponse response = client.upload(request);
    System.out.println(response.getStatus());
}

下載

private void download(String id) {
    RestRequest request = new RestRequest(serverUri + "/download");
    request.addParams("id", id);
	
    RestResponse response = client.download(request, new File("files/download/" + id + ".jpg"));
    System.out.println(response.getStatus());
}


服務器端代碼

@QueryParam

@GET
@Path("/user")
@Produces(MediaType.APPLICATION_JSON)
public SlwUser getUserById_Query(@QueryParam(value = "id") String id) {
    SlwUser u = userMap.get(id);
    return u;
}

@FormParam

@POST
@Path("/addForm")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void createStudentForm(@FormParam("userId") String userId, 
		@FormParam("userName") String userName, @FormParam("age") String age) {
    SlwUser user = new SlwUser(userId, userName, age);
    userMap.put(user.getUserId(), user);
}

@HeaderParam

@GET
@Path("/userh")
@Produces(MediaType.APPLICATION_JSON)
public SlwUser getUserById_Header(@HeaderParam(value = "id") String id) {
    SlwUser u = userMap.get(id);
    return u;
}

@PathParam

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public SlwUser getUserById(@PathParam("id") String id) {
    SlwUser u = userMap.get(id);
    return u;
}

@Produces

/**
 * 查詢001用戶, 返回xml數據
 */
@GET
@Path("/getUserXml")
@Produces(MediaType.APPLICATION_XML)
public SlwUser getUserXml() {
    SlwUser user = userMap.get("001");
    return user;
}

/**
 * 查詢002用戶, 返回json數據
 */
@GET
@Path("/getUserJson")
@Produces(MediaType.APPLICATION_JSON)
public SlwUser getUserJson() {
    SlwUser user = userMap.get("002");
    return user;
}

接收List<SlwUser>數據

/**
 * 接收List<SlwUser>數據 允許客戶端提交json或xml格式數據
 */
@Path("/addUserList")
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public void addStudentsByList(List<SlwUser> users) {
    if (users != null) {
	for (SlwUser user : users) 
            userMap.put(user.getUserId(), user);
    }
}

接收Map<String, SlwUser>數據

/**
 * 接收Map<String, SlwUser>數據, 允許客戶端提交json或xml格式數據
 */
@Path("/addUserMap")
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public void addStudentsByMap(Map<String, SlwUser> users) {
    if (users != null) {
	for (Map.Entry<String, SlwUser> item : users.entrySet()) 
    	    userMap.put(item.getValue().getUserId(), item.getValue());
    }
}

文件上傳

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadFile(@FormParam("username") String name, 
        @FormParam("file1") FileItem fileItem1,
	@FormParam("file2") FileItem fileItem2, 
        @FormParam("file3") FileItem fileItem3) throws Exception {
    System.out.println("Name:" + name);
    getFile(fileItem1);
    getFile(fileItem2);
    getFile(fileItem3);
}

private void getFile(FileItem fileItem) throws Exception {
    if (fileItem != null) {
	System.out.println("getFile-----------------------------------------");
	System.out.println("File Name:" + fileItem.getName());
	System.out.println("File Size:" + fileItem.getSize());
	System.out.println("File ContentType:" + fileItem.getContentType());

	String path = SlwContext.request().getServletContext().getRealPath("/");
	File file = new File(path + "files/" + fileItem.getName());
	fileItem.write(file);
    }
}

文件下載

@GET
@Path("/download")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public void downloadFile(@QueryParam(value = "id") String id) throws Exception {
    String path = SlwContext.request().getServletContext().getRealPath("/");
    File file = new File(path + "files/" + id + ".jpg");
    StreamUtil.downloadAttach(file, file.getName());
}

相關內容:

1、替代Jersey的超輕量RESTful框架—SlwRest(Super Lightweight Rest)

2、SlwRest(Super Lightweight Rest)RESTful框架服務端部署

3、SlwRest(Super Lightweight Rest)RESTful框架服務端開發(1)-RequestMethod

4、SlwRest(Super Lightweight Rest)RESTful框架服務端開發(2)-參數註解,LIST,MAP,文件上傳,下載

框架及DEMO下載:

超輕量RESTful框架—SlwRest(Super Lightweight)客戶端及服務端Demo代碼

王偉東

2018年7月

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章