הדרכה לשירותי רשת Restful ב-Java

ברוכים הבאים למדריך על שירותי הרשת בסגנון Restful בשפת ג'אווה. REST היא ראשי התיבות של המילה "REpresentational State Transfer". REST הוא סגנון ארכיטקטורה לפיתוח אפליקציות שניתן לגשת אליהן דרך הרשת. סגנון הארכיטקטורה REST הופק על ידי רוי פילדינג בטזיה שלו לרופאת דוקטורט בשנת 2000.

שירותי הרשת בסגנון Restful

שירותי הרשת בסגנון Restful הם ארכיטקטורה "ללא מצב" בין השרת ללקוח, שבה שירותי הרשת הם משאבים שניתן לזהותם על ידי ה-URI שלהם. יישומים לקוחות של REST יכולים להשתמש בשיטות GET / POST של פרוטוקול ה-HTTP כדי לקרוא ולכתוב לשירותים הרשת בסגנון Restful. REST אינו מגדיר פרוטוקול ספציפי לשימוש, אך ברוב המקרים הוא משמש על פי פרוטוקול ה-HTTP / HTTPS. בהשוואה לשירותי הרשת בסגנון SOAP, שירותי הרשת בסגנון Restful הם קלים יותר ואינם עוקבים אחר סטנדרט מסוים. ניתן להשתמש ב-XML, JSON, טקסט או כל סוג אחר של מידע כפניית ותגובה.

API לשירותי הרשת Restful בג'אווה

API לשירותי הרשת Restful בג'אווה (JAX-RS) היא חלק מ- JDK ומספקת את יכולות יצירת שירותים בסגנון REST. JAX-RS משתמשת באנוטציות כדי לפשט את פיתוח ופרסום שירותי הרשת. אין צורך להוסיף כל דבר נוסף על מנת להשתמש באנוטציות של JAX-RS.

הערות שירותי האינטרנט המנוחזות של Restful

חלק מההערות החשובות של JAX-RS הן:

  • @Path: משמש לציין את הנתיב היחסי של מחלקה ושיטות. ניתן לקבל את כתובת ה-URI של שירות אינטרנט על ידי סריקת ערך ההערה Path.
  • @GET, @PUT, @POST, @DELETE ו-@HEAD: משמשים לציין את סוג בקשת ה-HTTP עבור שיטה.
  • @Produces, @Consumes: משמשים לציין את סוגי הבקשה והתגובה.
  • @PathParam: משמש לקשר את פרמטר השיטה לערך הנתיב על ידי פריסתו.

שירותי האינטרנט המנוחזים ו-SOAP

  1. SOAP הוא פרוטוקול, בעוד ש-REST הוא סגנון ארכיטקטוני.
  2. יישומים של שרת ולקוח של SOAP קשורים באופן צמוד וקשורים בחוזה ה-WSDL, בעוד שאין חוזה בשירותי האינטרנט של REST ולקוח.
  3. המעגל הלמידה פשוט יותר עבור REST בהשוואה לשירותי האינטרנט של SOAP.
  4. סוגי בקשה ותגובה של שירותי האינטרנט של REST יכולים להיות XML, JSON, טקסט ועוד, בעוד ש-SOAP עובד רק עם XML.
  5. JAX-RS הוא ה- API של Java לשירותי REST web בעוד ש-JAX-WS הוא ה- API של Java לשירותי SOAP web.

יישומים של REST API

קיימות שתיי יישומיות עיקריות של ה- JAX-RS API.

  1. Jersey: Jersey הוא יישומון התייחסות הנתונים שסופק על ידי Sun. כדי להשתמש ב- Jersey כיישומון ה- JAX-RS שלנו, עלינו להגדיר את הסרבל שלו ב- web.xml ולהוסיף תלות נדרשות. שים לב ש- JAX-RS API הוא חלק מ- JDK ולא Jersey, לכן עלינו להוסיף את קובצי התלות שלו באפליקציה שלנו.
  2. RESTEasy: RESTEasy הוא פרויקט של JBoss שמספק יישומון של JAX-RS.

מדריך לשירותי RESTful Web ב-Java

בוא נראה כמה קל ליצור שירות רשת RESTful באמצעות 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

שירותי רשת RESTful ב-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 אך אם אתה כותב תוכנית Java כדי לקרוא לשירות רשת 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 ליישום הרשת שלנו, בקוד Java שלנו נשתמש באנוטציות 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 Web

בהתבסס על מבנה ה-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.

בדיקת שירותי RESTful

זהו. השירות האינטרנטי שלנו מוכן, פשוט ייצא אותו כקובץ WAR וישימו אותו בתיקיית webapps של Tomcat או להעלות אותו לכל מעטפת אחרת לבחירתך. להלן כמה מהבדיקות שבוצעו באמצעות תוסף ה־Postman בדפדפן Chrome עבור שירות האינטרנט הזה. יש לשים לב שעלינו לספק ערכים ל- Accept ול־ Content-Type כ-"application/xml" בכותרת הבקשה כפי שמוצג בתמונה למטה.

  • getDummy
  • הוסף
  • קבל
  • קבל_הכל
  • מחק

זהו כל הדברים ליצירת שירותי רשת באמצעות Jersey JAX-RS. כפי שאתה רואה, רוב הקוד משתמש בהערות JAX-RS ו-Jersey מחוברת דרך תיאור ההתקנה והתלות.

דוגמה לשירותי רשת RESTEasy

אנו נשתמש בכל לוגיקת העסקים שפותחה בפרויקט Jersey, אך במקום לבצע שינויים באותו הפרויקט, יצרתי פרויקט חדש. צור פרויקט דינמי באמצעות המרה לפרויקט Maven. לאחר מכן, העתק את כל המחלקות ב-Java – 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 בו אנו מגדירים את ה-Servlet של Resteasy.

<?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>

שים לב ל-init-param שבו אנו מספקים את הערך 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 Web Services Test

זהו. השירות האינטרנט שלנו מוכן עם יישום RESTEasy JAX-RS. למטה יש כמה מהפלטים ממבחן ההרחבה של Postman בדפדפן Chrome.

  • getDummy
  • הוסף
  • קבל

זה הכל עבור מדריך שירותי הרפואה המתנוחנים, אני מקווה שלמדת על האנוטציות JAX-RS והבנת את היתרונות של ישות API תקן שעזרה לנו בשימוש חוזר בקוד ובהעברה מ-Jersey ל-RESTEasy בקלות.

Source:
https://www.digitalocean.com/community/tutorials/restful-web-services-tutorial-java