مرحبًا بك في دليل خدمات الويب القائمة على REST في جافا. REST هو اختصار لـ REpresentational State Transfer. REST هو نمط معماري لتطوير التطبيقات التي يمكن الوصول إليها عبر الشبكة. تم تقديم نمط العمارة REST إلى الأضواء من قبل روي فيلدينغ في أطروحته الجامعية في عام 2000.
خدمات الويب القائمة على REST
خدمات الويب القائمة على REST هي بنية عميل خادم بدون حالة حيث تُعد خدمات الويب موارد يمكن تحديدها بواسطة معرفات الـ URI الخاصة بها. يمكن لتطبيقات العميل REST استخدام طرق HTTP GET/POST لاستدعاء خدمات الويب القائمة على REST. لا يحدد REST أي بروتوكول محدد للاستخدام ، ولكن في معظم الحالات يتم استخدامه عبر HTTP/HTTPS. بالمقارنة مع خدمات الويب SOAP ، فإن هذه الخدمات خفيفة الوزن ولا تتبع أي معيار. يمكننا استخدام XML و JSON والنص أو أي نوع آخر من البيانات للطلب والاستجابة.
Java RESTful Web Services API
واجهة برمجة التطبيقات في جافا لخدمات الويب القائمة على REST (JAX-RS) هي واجهة برمجة التطبيقات في جافا لإنشاء خدمات الويب القائمة على REST. تستخدم JAX-RS التعليقات لتبسيط تطوير ونشر خدمات الويب. تعتبر JAX-RS جزءًا من JDK ، لذا لا داعي لتضمين أي شيء لاستخدام تعليقاتها.
تعليقات خدمات الويب القائمة على REST
بعض التعليقات المهمة في JAX-RS هي:
@Path
: تُستخدم لتحديد المسار النسبي للفئة والأساليب. يمكننا الحصول على عنوان URI لخدمة الويب عن طريق مسح قيمة التعليق Path.@GET
،@PUT
،@POST
،@DELETE
و@HEAD
: تُستخدم لتحديد نوع طلب HTTP لطريقة.@Produces
،@Consumes
: تُستخدم لتحديد أنواع الطلب والاستجابة.@PathParam
: يُستخدم لربط معلمة الطريق بقيمة المسار عن طريق تحليلها.
خدمات الويب القائمة على REST وSOAP
- SOAP هو بروتوكول بينما REST هو نمط معماري.
- تكون تطبيقات خادم وعميل SOAP مرتبطة بإحكام ومرتبطة بعقد WSDL بينما لا يوجد عقد في خدمات الويب REST والعميل.
- من السهل تعلم REST مقارنةً بخدمات الويب SOAP.
- أنواع طلب واستجابة خدمات الويب REST يمكن أن تكون XML و JSON ونصية وما إلى ذلك بينما يعمل SOAP فقط مع XML.
- JAX-RS هو واجهة برمجة تطبيقات جافا لخدمات الويب REST بينما JAX-WS هو واجهة برمجة تطبيقات جافا لخدمات الويب SOAP.
تنفيذات واجهة برمجة تطبيقات REST
هناك تنفيذتان رئيسيتان لواجهة برمجة تطبيقات JAX-RS.
- Jersey: Jersey هو التنفيذ المرجعي المُقدم من قبل Sun. لاستخدام Jersey كتنفيذ JAX-RS الخاص بنا، كل ما علينا فعله هو تكوين سيرفلته في ملف web.xml وإضافة التبعيات المطلوبة. يجب ملاحظة أن واجهة برمجة تطبيقات JAX-RS هي جزء من JDK وليس Jersey، لذا يجب علينا إضافة تبعيات الاعتماد الخاصة به في تطبيقنا.
- RESTEasy: RESTEasy هو مشروع JBoss الذي يوفر تنفيذ JAX-RS.
دليل خدمات الويب الراحية باستخدام جافا
دعنا نرى مدى سهولة إنشاء خدمة ويب راحية باستخدام Jersey ومن ثم RESTEasy. سنقوم بعرض الوظائف التالية عبر HTTP واستخدام امتداد Chrome Postman لاختبارها.
URI | HTTP Method | Description |
---|---|---|
/person/{id}/getDummy | GET | Returns a dummy person object |
/person/add | POST | Adds a person |
/person/{id}/delete | GET | Delete the person with ‘id’ in the URI |
/person/getAll | GET | Get all persons |
/person/{id}/get | GET | Get the person with ‘id’ in the URI |
خدمات ويب Jersey الراحية
أنشئ مشروع ويب ديناميكي ثم قم بتحويله إلى Maven للحصول على هيكل مشروع خدمات الويب الخاص بك. يوضح الصورة أدناه هيكل المشروع النهائي. لنلقِ نظرة على تبعيات Jersey التي لدينا في ملف pom.xml.
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>JAXRS-Example</groupId>
<artifactId>JAXRS-Example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
ليس من الضروري إضافة تبعيات jersey-client ولكن إذا كنت تكتب برنامجًا برمجيًا لاستدعاء خدمة ويب REST باستخدام Jersey فيجب ذلك. الآن لنلقِ نظرة على وصف النشر لمعرفة كيفية تكوين Jersey لإنشاء تطبيق الويب الخاص بنا.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JAXRS-Example</display-name>
<!-- Jersey Servlet configurations -->
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.journaldev</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- Jersey Servlet configurations -->
</web-app>
هذا كل ما يلزم لإضافة Jersey إلى تطبيق الويب الخاص بنا، في كودنا جافا سنستخدم تعليمات JAX-RS. لاحظ قيمة معلمة التهيئة com.sun.jersey.config.property.packages
لتوفير الحزمة التي ستتم فحصها للعثور على موارد وأساليب خدمات الويب.
نماذج مثال REST
أولاً وقبل كل شيء سنقوم بإنشاء نموذجي بيانات – Person
لبيانات التطبيق الخاصة بنا و Response
لإرسال الاستجابة إلى أنظمة العملاء. نظرًا لأننا سنقوم بإرسال استجابة بتنسيق XML، يجب أن يتم تعليق الفصول بتعليمة @XmlRootElement
، ولذلك لدينا هذا الفصل.
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name="person")
public class Person {
private String name;
private int age;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString(){
return id+"::"+name+"::"+age;
}
}
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Response {
private boolean status;
private String message;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
خدمات تعليمية لتعلم خدمات ويب REST
بناءً على هيكل عنوان URI الخاص بنا، يُظهر الواجهة الخدمية وتنفيذ الكود كما يلي.
package com.journaldev.jaxrs.service;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
public interface PersonService {
public Response addPerson(Person p);
public Response deletePerson(int id);
public Person getPerson(int id);
public Person[] getAllPersons();
}
package com.journaldev.jaxrs.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
@Path("/person")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class PersonServiceImpl implements PersonService {
private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
@Override
@POST
@Path("/add")
public Response addPerson(Person p) {
Response response = new Response();
if(persons.get(p.getId()) != null){
response.setStatus(false);
response.setMessage("Person Already Exists");
return response;
}
persons.put(p.getId(), p);
response.setStatus(true);
response.setMessage("Person created successfully");
return response;
}
@Override
@GET
@Path("/{id}/delete")
public Response deletePerson(@PathParam("id") int id) {
Response response = new Response();
if(persons.get(id) == null){
response.setStatus(false);
response.setMessage("Person Doesn't Exists");
return response;
}
persons.remove(id);
response.setStatus(true);
response.setMessage("Person deleted successfully");
return response;
}
@Override
@GET
@Path("/{id}/get")
public Person getPerson(@PathParam("id") int id) {
return persons.get(id);
}
@GET
@Path("/{id}/getDummy")
public Person getDummyPerson(@PathParam("id") int id) {
Person p = new Person();
p.setAge(99);
p.setName("Dummy");
p.setId(id);
return p;
}
@Override
@GET
@Path("/getAll")
public Person[] getAllPersons() {
Set<Integer> ids = persons.keySet();
Person[] p = new Person[ids.size()];
int i=0;
for(Integer id : ids){
p[i] = persons.get(id);
i++;
}
return p;
}
}
معظم الكود يفسر نفسه، قم بقضاء بعض الوقت لتعرف نفسك على تعليمات JAX-RS @Path
، @PathParam
، @POST
، @GET
، @Consumes
و @Produces
.
اختبار خدمات ويب REST
هذا هو كل شيء. خدمة الويب الخاصة بنا جاهزة، قم بتصديرها كملف WAR وضعه في دليل تطبيقات الويب في Tomcat أو نشرها في أي حاوية أخرى تفضلها. فيما يلي بعض الاختبارات التي تم إجراؤها باستخدام امتداد Postman في متصفح Chrome لهذه الخدمة الويب. يجب علينا ملحوظة أنه يجب توفير قيم Accept و Content-Type كـ “application/xml” في رأس الطلب كما هو موضح في الصورة أدناه.
هذا كل شيء بالنسبة لإنشاء خدمات الويب باستخدام Jersey JAX-RS. كما يمكن رؤية أن معظم الشيفرة تستخدم تعليقات JAX-RS وتم توصيل Jersey من خلال وصف النشر والتبعيات.
مثال خدمات الويب القائمة على RESTEasy RESTful
سنستخدم جميع منطق الأعمال المطوّر في مشروع Jersey، ولكن بدلاً من إجراء التغييرات على نفس المشروع ، قمت بإنشاء مشروع جديد. قم بإنشاء مشروع ويب ديناميكي وتحويله إلى مشروع Maven. ثم قم بنسخ جميع الفئات الجافا – Person، Response، PersonService و PersonServiceImpl. فيما يلي المشروع النهائي بعد الانتهاء من جميع التغييرات. أضف تبعيات RESTEasy التالية في ملف pom.xml.
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.13.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.0.13.Final</version>
</dependency>
فيما يلي ملف web.xml حيث نقوم بتكوين خدمة Resteasy servlet.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JAXRS-Example-RestEasy</display-name>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.journaldev.jaxrs.resteasy.app.MyApp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
لاحظ معلمة التهيئة حيث نقدم الفئة “MyApp” كقيمة ، حيث نقوم بتوسيع فئة “javax.ws.rs.core.Application” على النحو الموضح أدناه.
package com.journaldev.jaxrs.resteasy.app;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.journaldev.jaxrs.service.PersonServiceImpl;
public class MyApp extends Application {
private Set<Object> singletons = new HashSet<Object>();
public MyApp() {
singletons.add(new PersonServiceImpl());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
اختبار خدمات ويب RESTEasy
هذا كل شيء. خدمة الويب الخاصة بنا جاهزة مع تنفيذ RESTEasy JAX-RS. فيما يلي بعض النتائج من اختبار امتداد Postman في متصفح Chrome.
هذا كل شيء بالنسبة لـدليل خدمات الويب الراحة، آمل أنك تعلمت عن تعليقات JAX-RS وفهمت فوائد وجود واجهة برمجة التطبيقات القياسية التي ساعدتنا في إعادة استخدام الشفرة والانتقال من Jersey إلى RESTEasy بسهولة.
Source:
https://www.digitalocean.com/community/tutorials/restful-web-services-tutorial-java