Spring RestController

تعتبر تعليقة Spring RestController تعليقة مريحة تم وضعها بنفسها على النوع المعلم بـ @Controller و @ResponseBody. يتم تطبيق هذه التعليقة على نوع لتحديده كمعالج طلبات. تستخدم تعليقة Spring RestController لإنشاء خدمات ويب RESTful باستخدام Spring MVC. تعلقة Spring RestController تهتم بتطبيق بيانات الطلب على الطريقة المحددة لمعالجة الطلب. بمجرد إنشاء جسم الاستجابة من طريقة المعالج، يتم تحويله إلى استجابة JSON أو XML.

مثال على تعليقة Spring RestController

لنرى كيف يمكننا استخدام RestController بسهولة لإنشاء خدمة ويب REST في Spring. سنعيد استخدام تنفيذ الـ Spring Repository وننشئ خدمة ويب راحة. سنقوم بإنشاء تطبيق ويب مستقل ولن نستخدم Spring Boot هنا. سنكشف أيضًا عن واجهات برمجة التطبيقات الخاصة بنا لدعم كلاً من JSON و XML في الطلبات والاستجابات. يظهر الصورة أدناه هيكل مشروعنا النهائي. تم توفير فئات النموذج والمستودع في برنامج تعليمي لـ Spring Repository. سنركز أكثر على تنفيذ RestController هنا.

تبعيات Maven لمشروع Spring RestController

لنلقي نظرة على التبعيات المطلوبة لإنشاء مشروع مثال لـ Spring RestController الخاص بنا.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>5.0.7.RELEASE</version>
</dependency>

<!-- Jackson for REST JSON Support -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.6</version>
</dependency>
<!-- JAXB for XML Response, needed to explicitly define from Java 9 onwards -->
<dependency>
	<groupId>javax.xml.bind</groupId>
	<artifactId>jaxb-api</artifactId>
	<version>2.3.0</version>
</dependency>
<dependency>
	<groupId>org.glassfish.jaxb</groupId>
	<artifactId>jaxb-runtime</artifactId>
	<version>2.3.0</version>
	<scope>runtime</scope>
</dependency>
<dependency>
	<groupId>javax.activation</groupId>
	<artifactId>javax.activation-api</artifactId>
	<version>1.2.0</version>
</dependency>

نحتاج إلى مكتبات Spring MVC و Jackson و JAXB لدعم طلبات واستجابات XML و JSON من خدمة ويب REST الخاصة بنا. ملف web.xml يُستخدم لتكوين Spring MVC DispatcherServlet كمتحكم أمامي. لنلقي نظرة على ملف Spring Context الآن.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
	xmlns="https://www.springframework.org/schema/mvc"
	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="https://www.springframework.org/schema/beans"
	xmlns:context="https://www.springframework.org/schema/context"
	xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<context:component-scan
		base-package="com.journaldev.spring" />

	<beans:bean id="jsonMessageConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
	<beans:bean id="xmlMessageConverter"
		class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />

	<beans:bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<beans:property name="messageConverters">
			<beans:list>
				<beans:ref bean="jsonMessageConverter" />
				<beans:ref bean="xmlMessageConverter" />
			</beans:list>
		</beans:property>
	</beans:bean>

</beans:beans>

الجزء الأكثر أهمية هو تعريف وضبط حاويات الـ jsonMessageConverter و xmlMessageConverter كفئات في خاصية messageConverters لـ RequestMappingHandlerAdapter. هذا كل ما يحتاجه Spring لمعرفة أننا نريد دعم التحويل بين JSON و XML وأن هذه هي الكائنات المستخدمة لذلك.

فصيلة Spring RestController

هنا تنفيذ فصيلة Spring RestController الخاصة بنا.

package com.journaldev.spring.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.journaldev.spring.model.Employee;
import com.journaldev.spring.repository.EmployeeRepository;

@RestController
public class EmployeeRestController {

	@Autowired
	private EmployeeRepository repository;
	
	@GetMapping("/rest/employee/get/{id}")
	public Employee getEmployeeByID(@PathVariable("id") int id) {
		return repository.retrieve(id);
	}
	
	@GetMapping("/rest/employee/getAll")
	//العودة بقائمة مدعومة فقط مع استجابة JSON
	//إذا كنت ترغب في XML، ثم أضف فئة مُغلفة كعنصر XML رئيسي، على سبيل المثال EmployeeList
	public List getAllEmployees() {
		return repository.getAll();
	}

	@PostMapping("/rest/employee/create")
	public Employee createEmployee(@RequestBody Employee emp) {
		repository.store(emp);
		return emp;
	}
	
	@GetMapping("/rest/employee/search/{name}")
	public Employee getEmployeeByName(@PathVariable("name") String name) {
		return repository.search(name);
	}
	
	@DeleteMapping("/rest/employee/delete/{id}")
	public Employee deleteEmployeeByID(@PathVariable("id") int id) {
		return repository.delete(id);
	}
}

لاحظ أننا قمنا فقط بتحديد واجهات برمجة التطبيقات الخاصة بنا هنا، جميع المنطق التجاري هو جزء من فئة المستودع. إذا كانت طريقتنا تعيد قائمة أو مصفوفة، فإن Spring ستدعم فقط استجابة JSON لأن عنصر الجذر في XML لا يمكن أن يكون مجهول، ولكن JSON يمكن. إذا كنت ترغب في دعم إرجاع القائمة كـ XML، فعليك إنشاء فئة محتويات لاحتواء هذه القائمة وإرجاعها. نتوقع كائن الموظف كطلب في بعض الطرق، سيهتم Spring بتحليل جسم الطلب وتحويله إلى كائن الموظف لهذه الطرق. بالمثل، نعيد كائن الموظف كجسم للاستجابة، مرة أخرى سيهتم Spring بتحويله إلى استجابة JSON/XML.

رؤوس الطلب Accept و Content-Type

لقد قمنا بتكوين تطبيق REST الخاص بنا للعمل مع كل من XML و JSON. فكيف سيعرف إذا ما إذا كان الطلب يتطلب XML أو JSON؟ وإذا كان الاستجابة يجب أن تكون بتنسيق JSON أو XML؟ هنا يتم استخدام رؤوس الطلب Accept و Content-Type. Content-Type: يحدد نوع المحتوى في جسم الطلب، إذا كانت قيمته “application/xml”، فسيعامل Spring جسم الطلب كوثيقة XML. إذا كانت قيمته “application/json”، فإن جسم الطلب يُعامل كـ JSON. Accept: يحدد نوع المحتوى الذي يتوقعه العميل كاستجابة. إذا كانت قيمته “application/xml”، فسيتم إرسال استجابة XML. إذا كانت قيمته “application/json”، فسيتم إرسال استجابة JSON.

اختبار Spring RestController

تطبيقنا جاهز للإختبار، لقد نشرته على Tomcat-9 وأقوم بإختباره باستخدام برنامج Postman. فيما يلي نتائج الاختبار مع الشرح.

استجابة Spring RestController GET بصيغة JSON

هذا طلب GET بسيط، النقطة المهمة للملاحظة هي قيمة رأس الطلب “Accept”.

استجابة Spring RestController GET بصيغة XML

عند تغيير قيمة رأس الطلب “Accept” إلى “application/xml”، نحصل على استجابة بصيغة XML.

استجابة Spring RestController GET بقائمة

دعونا نحاول استدعاء واجهة برمجة التطبيق للحصول على قائمة الموظفين. نحصل على قائمة العناصر في تنسيق JSON مع عنصر جذر مجهول. نظرًا لأن لغة XML لا تدعم عنصر جذر مجهول، نحصل على رسالة استثناء.

Spring RestController POST

Spring RestController POST مع طلب واستجابة بتنسيق JSON Spring RestController POST مع جسم الطلب بتنسيق JSON Spring RestController POST مع طلب بتنسيق JSON واستجابة بتنسيق XML

Spring RestController DELETE

ملخص

يساعدنا Spring RestController في التركيز على منطق الأعمال من خلال الاهتمام بجميع الأشياء الأساسية لإنشاء واجهات برمجة تطبيقات الويب REST.

يمكنك تنزيل المشروع الكامل من مستودع GitHub الخاص بنا.

Source:
https://www.digitalocean.com/community/tutorials/spring-restcontroller