یک Resource ساده در Jax-Rs جاوا
از سری مقالات Java Enterprise, میخواهیم یک Resource ساده ایجاد کنیم.
در مقاله قبل, شیوه ایجاد یک RESTful API با استفاده از Jax-Rs در جاوا را بررسی کردیم. در این مقاله قصد داریم تا یک Resource ایجاد کنیم و مفاهیم مرتبط با آن را بررسی کنیم. پروژه ای که از مقاله قبل ایجاد کردهایم را ادامه میدهیم.
در مرحله اول, یک package ایجاد میکنیم و آن را api مینامیم. package که کلاس های API را در خود نگهداری میکند, باید در web.xml تعریف شود.
<init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>zerotohero.vhdrjb.api</param-value> </init-param>
اگر کلاسی خارج از package تعریف شده باشد, به عنوان API در نظر گرفته نمیشود و در واقع دسترسی به آن از طریق این servlet امکان پذیر نیست.
اکنون میخواهیم یک Resource طراحی کنیم تا با استفاده از آن, اطلاعات کاربران را دریافت کنیم. در این گام, Java Bean را برای نگهداری اطلاعات کاربران ایجاد میکنیم:
public class UserModel { private String username; private String name; private String location; private int code; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public int getAge() { return code; } public void setAge(int code) { this.code = code; } public UserModel(String username, String name, String location, int code) { this.username = username; this.name = name; this.location = location; this.code = code; } }
در این کلاس اطلاعات مورد نیاز برای کاربران را نگهداری میکنیم. برای پیاده سازی این کلاس نیاز است تا به دو نکته توجه کنید. نکته اول این است که باید یک Constructor بدون متغیر ورودی برای کلاس تعریف کنید. نکته دوم این است که حتما xmlRootElement@ را باید به کلاس اضافه کنیم. این Annotation برای استفاده از JAXB است. Java Architecture XML Binding یا به اختصار JAXB, برای تبدیل کلاس ها به XML و برعکس است. برای مثال میتوانیم نام xml تولید شده را اینگونه تغییر دهیم:
@XmlRootElement(name = "profile") public class UserModel { private String username; private String name; private String location; private int code; }
بر اساس کد بالا, نام xml برابر profile است. Annotation پرکاربرد بعدی, xmltype است که با استفاده از متد properType میتوانیم ترتیب چاپ متغیر ها را مشخص کنیم:
@XmlType(propOrder = {"username", "location", "code", "name"})
در پروژه های بعدی نیز از JAXB استفاده خواهیم کرد.
در گام بعدی, یک کلاس برای دریافت این اطلاعات از پایگاه داده ایجاد میکنیم:
public class UserService { public static List<UserModel> models() { List<UserModel> userModels = new ArrayList<>(); userModels = getFromDatabase(); return userModels; } }
دریافت اطلاعات از طریق پایگاه داده را میتوان با استفاده از Hibernate انجام داد. تا به اینجا مقادیر از پایگاه داده دریافت شده اند و اکنون باید این مقادیر را در API استفاده کنیم. برای این منظور یک کلاس در api package ایجاد میکنیم و نام آن را ModelResource قرار میدهیم:
@Path("profiles") public class UserResource { @GET @Produces(MediaType.APPLICATION_XML) public List<UserModel> getProfiles() { return UserService.getModels(); } }
تا به اینجا ما یک Resource ایجاد و به آن دسترسی پیدا کردهایم. این نوع Resource ها که تمام مقادیر یا مجموعه ای از مقادیر را بر میگرداند, Collection Resources هستند. اما اگر بخواهیم یک مقدار خاص را برگردانیم, باید از Instance Resource استفاده کنیم. در مقاله قبل به چنین ساختاری اشاره شد:
/messages/{id}
به این معنا که, ID را ارسال میکنیم و پیام خاصی که با این ID متناسب است را برمیگردانیم. این نوع API ها از نوع Instance Resource هستند. در مثالی که در این مقاله بررسی کردیم, اطلاعات تمام کاربران را برمیگرداند و از نوع Collection Resource است.
اکنون یک متد به این پروژه اضافه میکنیم:
@GET @Path("/vhdrjb") @Produces(MediaType.APPLICATION_XML) public UserModel getProfile() { return new UserModel("Vahid Rajabi", "vhdrjb", "Iran", 10); }
و میتوان با این آدرس به این متد دسترسی پیدا کرد:
http://localhost:8080/api/profiles/vhdrjb
اما اگر بخواهیم دریافت اطلاعات کاربران به صورت dynamic انجام شود, دریافت متغیر نیز باید dynamic باشد.
@GET @Path("/{profile}") @Produces(MediaType.APPLICATION_XML) public UserModel getProfile() { return new UserModel("Vahid Rajabi", "vhdrjb", "Iran", 10); }
اکنون هر مقداری را بعد از profile قرار دهیم, خروجی فوق را نمایش میدهد. اگر بخواهیم متغیر را دریافت کنیم, باید به این صورت عمل کنیم:
@GET @Path("/{profile}") @Produces(MediaType.APPLICATION_XML) public UserModel getProfile(@PathParam("profile") String username) { return UserService.getProfile(username); }
اکنون یک Instance Resource نیز برای API ایجاد کردیم. در این مقاله سعی بر این شد تا با استفاده از مفاهیم تعریف شده, یک Resource ایجاد کنیم و همچنین انواع Resource URI را بررسی کنیم.
سری مقالات آموزش Java Enterprise ادامه دارد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.