سوف تغطي مقالة اليوم الأسئلة الأساسية حول REST in Spring. سيكون مفيدًا بشكل خاص للمبرمجين المبتدئين.
الدليل الرسمي من Pivotal ، الذي يقول عن مواضيع للتحضير.

Spring REST جزء من Spring MVC. لذلك ، سيتم استخدام الكثير من Spring MVC في REST والعكس بالعكس. لإلقاء نظرة أكثر تعمقا على Spring MVC ، اقرأ هذه المقالة .
ما تم إنشاء REST من أجله؟لفهم مفهوم REST ، تحتاج إلى تحليل الاختصار في مكوناته:
- التمثيل - الموارد في REST يمكن تمثيلها بأي شكل - JSON أو XML أو نص أو حتى HTML - يعتمد على البيانات الأكثر ملاءمة للمستهلك
- الحالة - عند العمل مع REST ، يجب أن تركز على حالة المورد ، وليس على الإجراءات مع المورد
- نقل - يشمل REST نقل بيانات المورد ، بأي شكل من الأشكال ، من تطبيق إلى آخر.
REST هو نقل حالات الموارد بين الخادم والعميل.
ما هو المورد؟المورد في REST هو كل ما يمكن نقله بين عميل وخادم.
فيما يلي بعض الأمثلة للموارد:
- أخبار
- درجة الحرارة في سان بطرسبرغ يوم الاثنين الساعة 4 صباحًا
- راتب الموظف
- اختيار قاعدة البيانات
- نتيجة البحث
ماذا يقف كرود؟يتم تحديد الإجراءات في REST بواسطة طرق http.
Get
، Post
، Put
، Delete
، Patch
، وغيرها.
يشار إلى الأكثر استخداما من قبل اختصار CRUD:
- إنشاء -
POST
- قراءة -
GET
- تحديث - وضع
- حذف -
DELETE
هل REST آمن؟ كيف يمكنك حمايته؟بشكل افتراضي ، REST غير آمن.
يمكنك تكوين الأمان باستخدام Basic Auth و JWT و OAuth2
.
ما هو حفظ العمليات؟هذه هي العمليات التي لا تعدل الموارد. وهنا قائمة منهم:
ما هي العملية العاطفية؟ ما أهمية العاطفة؟طرق Idempotent هي طرق يكون لكل طلب فيها النتيجة نفسها.
أي أن النتيجة بعد استدعاء واحد لهذه الطريقة ستكون هي نفسها النتيجة بعد 10 مكالمات من هذه الطريقة.
هذا مهم لواجهة برمجة التطبيقات التي تتحمل الأخطاء. لنفترض أن العميل يريد تحديث مورد باستخدام طلب POST؟ إذا لم يكن POST طريقة عشوائية ، فستتسبب مكالمة متعددة في حدوث تحديثات غير متوقعة للموارد. باستخدام الأساليب العاطفية ، فإنك تحمي نفسك من العديد من الأخطاء.
هل مقياس REST جيد؟نعم. بقية المقاييس بشكل جيد لأنه لا يخزن الحالة.
هذا يعني أنه لا يخزن معلومات جلسة المستخدم على الخادم.
يجب ألا يتم تخزين معلومات العميل على جانب الخادم ، ولكن يجب إرسالها في كل مرة إلى حيث تكون هناك حاجة إليها. هذا هو ما تعنيه ST في REST ، نقل الولاية. يمكنك تمرير الدولة ، وليس تخزينها على الخادم.
REST أيضًا قابلاً للتشغيل المتداخل - وهذا يعني أن البرامج المختلفة المكتوبة بلغات مختلفة يمكن أن تتفاعل عليها. هذا يأتي من 2 عوامل:
- عملاء HTTP المتداخلين. يجب على العملاء المختلفين إرسال نفس طلبات HTTP.
- إمكانية التشغيل المتداخل على مستوى أنواع الوسائط. يجب على العملاء المختلفين إرسال وتلقي نفس الموارد بشكل صحيح.
ما هو HttpMessageConverter؟HttpMessageConverter
يحول الطلب إلى كائن والعكس بالعكس.
يحتوي Spring على العديد من تطبيقات هذه الواجهة ، ويمكنك إنشاء الخاصة بك.
في هذه الحالة ، لا يستخدم DispatcherServlet
Model and View.
في REST ، النموذج والعرض غير موجودة على الإطلاق. لا يوجد سوى البيانات التي يتم توفيرها بواسطة وحدة التحكم وتمثيل المورد عندما يتم تحويل الرسالة من نوع وسائط (json، xml ...) إلى كائن.
قائمة المحولات:
BufferedImageHttpMessageConverter
- يحول BufferedImage
إلى (من) رمز الصورة.
Jaxb2RootElementHttpMessageConverter
- يحول xml إلى (من) كائن مميز بتعليقات jaxb2. سجل إذا jaxb2 في classpath.
MappingJackson2HttpMessageConverter
- يحول JSON إلى (من) كائن. قم بالتسجيل إذا كان Jackson 2 في classpath.
StringHttpMessageConverter
- يحول جميع ملفات الوسائط إلى نص / عادي.
كيف يعمل التعليق التوضيحيRestController؟يتم وضع @RestController
في فئة وحدة التحكم بدلاً من @Controller
. وتشير إلى أن هذا الفصل لا يعمل على النماذج ، ولكن على البيانات. يتكون من @RequestBody
و @RequestBody
.
@Controller @ResponseBody public interface RestController
لماذا @ ريسبونس بودي؟يتم وضع @ResponseBody
على الأساليب التي تعمل مع البيانات ، وليس مع النماذج. لا يلزم تحديده بشكل صريح إذا @RestController
استخدام @RestController
.
الأساليب المعتادة ترجع Model
، @ResponseBody
الطرق المشروحة @ResponseBody
الكائنات التي يتم تحويلها إلى ملفات الوسائط باستخدام HttpMessageConverter
.
ماذا يفعل التعليق التوضيحيRequestMapping؟يستخدم هذا التعليق التوضيحي لتعيين الطلبات للتحكم في الطبقات والأساليب.
في السابق ، كان يستخدم لطرق الفصل للإشارة إلى URI ، وطريقة http ، ونوع البيانات المرسلة ، إلخ. في الإصدارات الأحدث من Spring ، تم استبداله @GetMapping
توضيحية @GetMapping
، @PostMapping
، إلخ.
الآن يتم استخدامه فقط للإشارة إلى URI إلى فئة وحدة التحكم.
ما هي التعليقات التوضيحيةGetMapping وPostMapping وDeleteMapping وغيرها؟هذه تعليقات توضيحية أضيق لتعيين أساليب http.
@GetMapping
- الحصول على طلبات الحصول على مقابض@PostMapping
- يعالج طلبات النشر@DeleteMapping
- مقابض حذف الطلبات@PutMapping
- وضع مقابض الطلبات@PatchMapping
- يعالج طلبات التصحيح
كل شيء مكتوب أدناه هو أيضا سمة من الشروح الأخرى.
AnnotationGetMapping هو مجرد تعليق توضيحي يحتوي على RequestMapping (الطريقة = RequestMethod.GET) .
كما يسمح لك بضبط طريقة المعالج.
المعلمات الخاصة به (يتم تحويلها إلى معلمات مماثلةRequestMapping):
لماذا استخدام التعليق التوضيحيRequestParam؟يتم استخدام هذا التعليق التوضيحي حتى تتمكن أساليب المعالج من الحصول على معلمات من طلب http.
طلب مع المعلمات: http://localhost:8080/getByName/name=Ivan
.
الكود التالي سوف يضع السلسلة Ivan
في name
المتغير.
@GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) {
لماذا استخدام التعليق التوضيحيPathVariable؟يحصل هذا التعليق التوضيحي على جزء محدد من URI.
URI: http://localhost:8080/getById/23
سيضع الكود التالي 23
في متغير المتغير.
@GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) {
ماذا تعني الرموز المختلفة لاستجابات http؟الحصول على - 200 موافق
POST - 200 OK ، 201 تم الإنشاء ، 204 لا يوجد محتوى
وضع - 200 موافق ، 201 تم الإنشاء ، 204 لا يوجد محتوى
حذف - 204 لا يوجد محتوى ، 202 مقبول
لماذا أحتاج إلى تعليق توضيحيResponseStatus؟انها تسمح لك لضبط رمز الاستجابة. عادةً ، يعيّن Spring نفسه رمز الاستجابة المطلوب ، ولكن هناك أوقات تحتاج فيها إلى تجاوزها.
@PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...}
بدلاً من استخدام التعليقات التوضيحية ، يمكنك إرجاع ResponseEntity
وتعيين رمز الاستجابة يدويًا.
باستخدام ResponseEntity
و @ReponseStatus
معاً غير مستحسن.
ما هو ResponseEntity؟هذه فئة خاصة تمثل استجابة http. أنه يحتوي على نص الاستجابة ورمز الحالة والرؤوس. يمكننا استخدامه لضبط استجابة http.
إنه نوع عالمي ، ويمكن استخدام أي كائن كجسم:
@GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); }
لماذاRequestBody؟يمكنك استخدام التعليق التوضيحي @RequestBody
على معلمة أسلوب بحيث يتم تحويل نص الطلب إلى هذه المعلمة.
@PostMapping("accounts")
يمكنك استخدام @Validated
مع @RequestBody
للتحقق من وجود طلب.
ما هو RestTemplate؟ ما هي مزاياه؟RestTemplate هو عميل خاص في Spring لإرسال طلبات http. يوفر واجهات برمجة تطبيقات مريحة للاتصال بسهولة بنقاط النهاية REST على سطر واحد.
RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
يمكنك معرفة المزيد حول الاستخدام في هذه المقالة .