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下載:
王偉東
2018年7月