এটি আমাদের REST এর ওভারভিউয়ের চূড়ান্ত অংশ। পূর্ববর্তী অংশে, আমরা কভার করেছি:
"পরবর্তী" বোতামটি ক্লিক করুন। পরবর্তী উইন্ডোতে, প্রকল্পের ধরন হিসাবে "Maven প্রজেক্ট" উল্লেখ করুন, "গ্রুপ" এবং "আর্টিফ্যাক্ট" উল্লেখ করুন:
"পরবর্তী" বোতামে ক্লিক করুন। পরবর্তী উইন্ডোতে, আমাদের প্রকল্পের জন্য প্রয়োজনীয় স্প্রিং ফ্রেমওয়ার্ক উপাদান নির্বাচন করতে হবে। স্প্রিং ওয়েব আমাদের জন্য যথেষ্ট হবে:
"পরবর্তী" বোতামে ক্লিক করুন। এখন যা অবশিষ্ট থাকে তা হল প্রকল্পের নাম এবং ফাইল সিস্টেমে এর অবস্থান নির্দেশ করা:
"সমাপ্ত" বোতামে ক্লিক করুন। প্রকল্পটি তৈরি করা হয়েছে, এবং এখন আমরা এর গঠন দেখতে পাচ্ছি: IDEA আমাদের জন্য
একটি Maven ডিপ্লয়মেন্ট বর্ণনাকারী (pom.xml) এবং অ্যাপ্লিকেশনটির প্রধান ক্লাস ( ) তৈরি করেছে।
উপরের বাম কোণে "নতুন" বোতামটি ক্লিক করুন। এর পরে, "অনুরোধ" নির্বাচন করুন:
এর পরে, এটিকে একটি নাম দিন এবং এটি সংরক্ষণ করুন। এখন সার্ভারে একটি POST অনুরোধ পাঠানোর চেষ্টা করা যাক এবং প্রথম গ্রাহক তৈরি করুন:
আমরা এইভাবে বেশ কিছু গ্রাহক তৈরি করি। তারপরে আমরা GET-তে অনুরোধের ধরণ পরিবর্তন করি এবং সার্ভারে অনুরোধ পাঠাই:

একটি প্রকল্প তৈরি করা হচ্ছে
এই বিভাগে, আমরা স্প্রিং বুট ব্যবহার করে একটি ছোট RESTful অ্যাপ্লিকেশন তৈরি করব। আমাদের অ্যাপ্লিকেশনটি ওভারভিউয়ের পূর্ববর্তী অংশের উদাহরণ থেকে গ্রাহকদের উপর CRUD (তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন) ক্রিয়াকলাপ বাস্তবায়ন করবে। শুরু করতে, আমরা মেনুটির মাধ্যমে একটি নতুন স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করব: ফাইল -> নতুন -> প্রকল্প... যে উইন্ডোটি খোলে, সেখানে স্প্রিং ইনিশিয়ালাইজার নির্বাচন করুন এবং প্রকল্প SDK নির্দিষ্ট করুন:




RestExampleApplication
তারা দেখতে কেমন তা এখানে:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.codegym.lessons/groupId>
<artifactId>rest_example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rest_example</name>
<description>REST example project</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
RestExampleApplication:
@SpringBootApplication
public class RestExampleApplication {
public static void main(String[] args) {
SpringApplication.run(RestExampleApplication.class, args);
}
}
REST কার্যকারিতা তৈরি করা
আমাদের অ্যাপ্লিকেশন একটি গ্রাহক ব্যবস্থাপনা সিস্টেম. সুতরাং, প্রথমে আমাদের যা করতে হবে তা হল একটি গ্রাহক সত্তা তৈরি করা। এটি একটি POJO (সাধারণ পুরানো জাভা অবজেক্ট) ক্লাস হবে।model
প্যাকেজের ভিতরে একটি প্যাকেজ তৈরি করুন com.codegym.lessons.rest_example
। প্যাকেজের ভিতরে model
, তৈরি করুন Customer
:
public class Customer {
private Integer id;
private String name;
private String email;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
পরিষেবাটি গ্রাহকদের উপর CRUD অপারেশন বাস্তবায়ন করবে। পরবর্তী পদক্ষেপ হল একটি পরিষেবা তৈরি করা যা এই ক্রিয়াকলাপগুলিকে বাস্তবায়ন করবে৷ প্যাকেজে com.codegym.lessons.rest_example
, একটি service
প্যাকেজ তৈরি করুন। এবং এর ভিতরে, একটি CustomerService
ইন্টারফেস তৈরি করুন। এখানে মন্তব্য সহ ইন্টারফেস কোড আছে:
public interface CustomerService {
/**
* Creates a new customer
* @param customer - Customer to be created
*/
void create(Customer customer);
/**
* Returns a list of all existing customers
* @return List of customers
*/
List<Customer> readAll();
/**
* Returns a customer based on its ID
* @param id - Customer ID
* @return - Customer object with the given ID
*/
Customer read(int id);
/**
* Updates the customer with the given ID,
* according to the passed customer
* @param customer - Customer to use to update the data
* @param id - ID of the customer you want to update
* @return - true if the data has been updated, otherwise false
*/
boolean update(Customer customer, int id);
/**
* Deletes the customer with the given ID
* @param id - ID of the customer to be deleted
* @return - true if the customer was deleted, otherwise false
*/
boolean delete(int id);
}
পরবর্তী, আমাদের এই ইন্টারফেসটি বাস্তবায়ন করতে হবে। এখন একটি Map<Integer, Customer>
আমাদের গ্রাহকদের সংরক্ষণ করবে. মানচিত্রের কীগুলি হবে গ্রাহক আইডি, এবং মানগুলি গ্রাহকদের নিজেরাই হবে৷ একটি বাস্তব ডাটাবেসের সাথে কাজ করার সুনির্দিষ্টতার সাথে এই উদাহরণটিকে ওভারলোড না করার জন্য এটি করা হয়। যাইহোক, ভবিষ্যতে আমরা ইন্টারফেসের আরেকটি বাস্তবায়ন লিখতে সক্ষম হব, যা একটি বাস্তব ডাটাবেসের সাথে সংযোগ স্থাপন করা সম্ভব করবে। প্যাকেজে service
, ইন্টারফেসের একটি বাস্তবায়ন তৈরি করুন CustomerService
:
@Service
public class CustomerServiceImpl implements CustomerService {
// Customer repository
private static final Map<Integer, Customer> CUSTOMER_REPOSITORY_MAP = new HashMap<>();
// Variable for generating a customer ID
private static final AtomicInteger CUSTOMER_ID_HOLDER = new AtomicInteger();
@Override
public void create(Customer customer) {
final int customerId = CUSTOMER_ID_HOLDER.incrementAndGet();
customer.setId(customerId);
CUSTOMER_REPOSITORY_MAP.put(customerId, customer);
}
@Override
public List<Customer> readAll() {
return new ArrayList<>(CUSTOMER_REPOSITORY_MAP.values());
}
@Override
public Customer read(int id) {
return CUSTOMER_REPOSITORY_MAP.get(id);
}
@Override
public boolean update(Customer customer, int id) {
if (CUSTOMER_REPOSITORY_MAP.containsKey(id)) {
customer.setId(id);
CUSTOMER_REPOSITORY_MAP.put(id, customer);
return true;
}
return false;
}
@Override
public boolean delete(int id) {
return CUSTOMER_REPOSITORY_MAP.remove(id) != null;
}
}
টীকাটি @Service
বসন্তকে বলে যে এই ক্লাসটি একটি পরিষেবা। এটি একটি বিশেষ ধরনের ক্লাস যা কিছু ব্যবসায়িক অ্যাপ্লিকেশন যুক্তি প্রয়োগ করে। পরবর্তীকালে, এই টীকাটির জন্য ধন্যবাদ, স্প্রিং নির্ভরতা ইনজেকশন ব্যবহার করবে যেখানে এটির প্রয়োজন আছে এমন সমস্ত জায়গায় এই শ্রেণীর একটি উদাহরণ প্রদান করতে। এখন একটি কন্ট্রোলার তৈরি করার সময়। এটি একটি বিশেষ শ্রেণী যেখানে আমরা এন্ডপয়েন্টে (ইউআরআই) পাঠানো ক্লায়েন্ট অনুরোধ প্রক্রিয়াকরণের জন্য যুক্তি প্রয়োগ করব। এই সমস্ত পরিষ্কার করার জন্য, আমরা এই ক্লাসটি ক্রমাগতভাবে তৈরি করব। প্রথমে, ক্লাস নিজেই তৈরি করুন এবং এর উপর নির্ভরতা যোগ করুন CustomerService
:
@RestController
public class CustomerController {
private final CustomerService customerService;
@Autowired
public CustomerController(CustomerService customerService) {
this.customerService = customerService;
}
}
আসুন টীকাগুলি ব্যাখ্যা করি: @RestController স্প্রিংকে বলে যে এই ক্লাসটি একটি REST কন্ট্রোলার। অন্য কথায়, এই শ্রেণীটি ক্লায়েন্ট অনুরোধ প্রক্রিয়াকরণের জন্য যুক্তি প্রয়োগ করে। @Autowired স্প্রিংকে বলে যে এখানে একটি নির্ভরতা যোগ করা দরকার। আমরা CustomerService
কনস্ট্রাক্টরের কাছে ইন্টারফেসটি পাস করি। এর আগে, আমরা এই পরিষেবাটির বাস্তবায়নকে টীকা দিয়ে চিহ্নিত করেছি @Service
, এবং এখন স্প্রিং এই বাস্তবায়নের একটি উদাহরণ কন্ট্রোলারের কনস্ট্রাক্টরের কাছে পাঠাতে সক্ষম হবে। পরবর্তী, আমরা CRUD অপারেশন পরিচালনার জন্য প্রতিটি নিয়ামক পদ্ধতি প্রয়োগ করব। তৈরি অপারেশন দিয়ে শুরু করা যাক। এটি করার জন্য, আমরা একটি create
পদ্ধতি লিখি:
@PostMapping(value = "/customers")
public ResponseEntity<?> create(@RequestBody Customer customer) {
customerService.create(customer);
return new ResponseEntity<>(HttpStatus.CREATED);
}
আসুন এই পদ্ধতিটি বিশ্লেষণ করা যাক: @PostMapping(value = "/customers")
মানে এই পদ্ধতিটি "/ গ্রাহকদের" ঠিকানায় পাঠানো POST অনুরোধগুলি প্রক্রিয়া করে৷ পদ্ধতিটি একটি ফেরত দেয় ResponseEntity<?>
। A ResponseEntity
হল একটি বিশেষ শ্রেণী যা উত্তর দেওয়ার জন্য। পরে, আমরা ক্লায়েন্টকে একটি HTTP স্ট্যাটাস কোড ফেরত দিতে এটি ব্যবহার করব। পদ্ধতির একটি @RequestBody Customer customer
প্যারামিটার আছে। এই প্যারামিটারের মান অনুরোধের বডি থেকে আসে। টীকাটি @RequestBody
এটি নির্দেশ করে। পদ্ধতির মূল অংশের ভিতরে, আমরা create()
পূর্বে তৈরি পরিষেবাতে পদ্ধতিটিকে কল করি এবং পরামিতিতে প্রাপ্ত গ্রাহক নিয়ন্ত্রককে পাস করি। ResponseEntity
তারপরে আমরা একটি নতুন অবজেক্ট তৈরি করে এবং সংশ্লিষ্ট HttpStatus
enum ক্ষেত্রটি পাস করে "201 তৈরি করা" স্থিতি ফিরিয়ে দিই । পরবর্তী, আমরা বাস্তবায়ন করবread
অপারেশন: প্রথমে, আমরা সমস্ত উপলব্ধ গ্রাহকদের একটি তালিকা পেতে অপারেশনটি বাস্তবায়ন করব:
@GetMapping(value = "/customers")
public ResponseEntity<List<Customer>> read() {
final List<Customer> customers = customerService.readAll();
return customers != null && !customers.isEmpty()
? new ResponseEntity<>(customers, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
এর মধ্যে ডুব দেওয়া যাক: @GetMapping(value = "/customers")
— এখানে সবকিছু টীকা অনুরূপ @PostMapping
, কিন্তু এখন আমরা GET অনুরোধ প্রক্রিয়া করছি. এইবার আমরা একটি ResponseEntity<List<Customer>>
, এবং একটি HTTP স্থিতি ছাড়াও, আমরা একটি প্রতিক্রিয়া বডিও ফেরত দেব, যা গ্রাহকদের তালিকা হবে৷ স্প্রিং এর REST কন্ট্রোলারে, সবকিছুই হল POJO অবজেক্ট এবং POJO অবজেক্টের সংগ্রহ, যেগুলি রেসপন্স বডি হিসাবে ফেরত দেওয়া হয় এবং স্বয়ংক্রিয়ভাবে JSON-এ সিরিয়ালাইজ করা হয়, যদি না অন্যথায় নির্দিষ্ট করা হয়। এটি আমাদের পুরোপুরি উপযুক্ত। পদ্ধতির ভিতরে, আমরা সমস্ত গ্রাহকদের একটি তালিকা পেতে আমাদের পরিষেবা ব্যবহার করি। পরবর্তী, যদি তালিকাটি শূন্য না হয় এবং খালি না হয়, তাহলে আমরা ব্যবহার করিResponseEntity
গ্রাহকদের তালিকা এবং "200 ঠিক আছে" HTTP স্ট্যাটাস কোড ফেরত দিতে ক্লাস। অন্যথায়, আমরা কেবল "404 পাওয়া যায়নি" HTTP স্ট্যাটাস কোড ফেরত দিই। এখন আমরা একটি গ্রাহককে তার আইডি ব্যবহার করে পাওয়ার ক্ষমতা বাস্তবায়ন করব:
@GetMapping(value = "/customers/{id}")
public ResponseEntity<Customer> read(@PathVariable(name = "id") int id) {
final Customer customer = customerService.read(id);
return customer != null
? new ResponseEntity<>(customer, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
এখানে একটি নতুন জিনিস পাথ পরিবর্তনশীল. পরিবর্তনশীলটি URI-তে সংজ্ঞায়িত করা হয়েছে value = "/customers/{id}"
: আমরা এটি কোঁকড়া ধনুর্বন্ধনীতে নির্দেশ করি। এবং আমরা টীকা int
ব্যবহার করে একটি পদ্ধতি পরামিতি হিসাবে এটি গ্রহণ করি @PathVariable(name = "id")
। এই পদ্ধতিটি ফর্মে URI-তে পাঠানো অনুরোধগুলিকে গ্রহণ করবে /customers/{id}
, যেখানে {id}
যেকোনো সাংখ্যিক মান প্রতিনিধিত্ব করে। int id
এই মানটি পরবর্তীতে ভেরিয়েবলের মাধ্যমে মেথড প্যারামিটারে পাঠানো হয় । দেহে, আমরা Customer
আমাদের পরিষেবা ব্যবহার করে বস্তুটি পাই এবং প্রাপ্ত করি id
। এবং তারপরে, তালিকার সাথে সাদৃশ্যের দ্বারা, আমরা হয় "200 ঠিক আছে" স্ট্যাটাস এবং বস্তুটি Customer
নিজেই, অথবা সিস্টেমের যদি কোনও গ্রাহক না থাকে তবে কেবল "404 পাওয়া যায়নি" স্থিতি ফেরত দিই id
। আমাদের এখনও দুটি অপারেশন বাস্তবায়ন করতে হবে: আপডেট এবং মুছুন। এখানে এই পদ্ধতির জন্য কোড আছে:
@PutMapping(value = "/customers/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Customer customer) {
final boolean updated = customerService.update(customer, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/customers/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = customerService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
এই পদ্ধতিতে মূলত নতুন কিছু নেই, তাই আমরা বিস্তারিত বিবরণ এড়িয়ে যাব। উল্লেখ করার মতো একমাত্র জিনিস হল যে update()
পদ্ধতিটি PUT অনুরোধগুলি ( @PutMapping
টীকা) পরিচালনা করে এবং delete()
পদ্ধতিটি DELETE অনুরোধগুলি ( DeleteMapping
টীকা) পরিচালনা করে। এখানে নিয়ামকের জন্য সম্পূর্ণ কোড:
@RestController
public class CustomerController {
private final CustomerService customerService;
@Autowired
public CustomerController(CustomerService customerService) {
this.customerService = customerService;
}
@PostMapping(value = "/customers")
public ResponseEntity<?> create(@RequestBody Customer customer) {
customerService.create(customer);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@GetMapping(value = "/customers")
public ResponseEntity<List<Customer>> read() {
final List<Customer> customers = customerService.readAll();
return customers != null && !customers.isEmpty()
? new ResponseEntity<>(customers, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@GetMapping(value = "/customers/{id}")
public ResponseEntity<Customer> read(@PathVariable(name = "id") int id) {
final Customer customer = customerService.read(id);
return customer != null
? new ResponseEntity<>(customer, HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
@PutMapping(value = "/customers/{id}")
public ResponseEntity<?> update(@PathVariable(name = "id") int id, @RequestBody Customer customer) {
final boolean updated = customerService.update(customer, id);
return updated
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
@DeleteMapping(value = "/customers/{id}")
public ResponseEntity<?> delete(@PathVariable(name = "id") int id) {
final boolean deleted = customerService.delete(id);
return deleted
? new ResponseEntity<>(HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.NOT_MODIFIED);
}
}
ফলস্বরূপ, আমাদের প্রকল্পের কাঠামো নিম্নরূপ: 
লঞ্চ এবং পরীক্ষা
main()
আমাদের অ্যাপ্লিকেশন শুরু করতে, ক্লাসে পদ্ধতিটি চালান RestExampleApplication
। কিন্তু RESTful ওয়েব পরিষেবাগুলি পরীক্ষা করার জন্য, আমাদের অতিরিক্ত সফ্টওয়্যার ডাউনলোড করতে হবে। আসল বিষয়টি হল যে GET অনুরোধগুলি একটি সাধারণ ব্রাউজার থেকে প্রেরণ করা বেশ সহজ, তবে একটি সাধারণ ব্রাউজার POST, PUT এবং DELETE অনুরোধ পাঠাতে পারে না। চিন্তা করবেন না: আপনি যে কোনও HTTP অনুরোধ পাঠাতে পোস্টম্যান নামে একটি প্রোগ্রাম ব্যবহার করতে পারেন। আপনি এখানে এটি ডাউনলোড করতে পারেন . পোস্টম্যান ডাউনলোড এবং ইনস্টল করার পরে, আমরা আমাদের অ্যাপ্লিকেশন পরীক্ষা করা শুরু করি। এটি করার জন্য, প্রোগ্রামটি খুলুন এবং একটি নতুন অনুরোধ তৈরি করুন: 



সারসংক্ষেপ
অভিনন্দন! আমরা পর্যাপ্তভাবে REST কভার করেছি। প্রচুর পরিমাণে উপাদান ছিল, তবে আশা করি এটি আপনার জন্য দরকারী ছিল:-
আমরা শিখেছি REST কি।
-
আমরা শিখেছি কিভাবে REST অস্তিত্বে এসেছে।
-
আমরা এই স্থাপত্য শৈলীর সীমাবদ্ধতা এবং নীতিগুলি সম্পর্কে কথা বলেছি:
- ক্লায়েন্ট-সার্ভার আর্কিটেকচার
- রাষ্ট্রহীন
- ক্যাশিং
- অভিন্ন ইন্টারফেস
- স্তর
- চাহিদা অনুযায়ী কোড (ঐচ্ছিক)
-
আমরা REST দ্বারা প্রদত্ত সুবিধাগুলি অন্বেষণ করেছি৷
-
HTTP প্রোটোকলের মাধ্যমে সার্ভার এবং ক্লায়েন্ট কীভাবে একে অপরের সাথে যোগাযোগ করে তা আমরা বিস্তারিতভাবে পরীক্ষা করেছি।
-
আমরা অনুরোধ এবং প্রতিক্রিয়াগুলি ঘনিষ্ঠভাবে দেখেছি। আমরা তাদের উপাদান অংশ ব্যবচ্ছেদ.
-
অবশেষে, আমরা স্প্রিং বুট ব্যবহার করে আমাদের নিজস্ব ছোট RESTful অ্যাপ্লিকেশন লিখে কিছু বাস্তব অভিজ্ঞতা পেয়েছি। এবং আমরা এমনকি পোস্টম্যান ব্যবহার করে এটি পরীক্ষা করতে শিখেছি।
বাড়ির কাজ
নিম্নলিখিত চেষ্টা করুন:- উপরের বর্ণনা অনুসরণ করে, আপনার নিজস্ব স্প্রিং বুট প্রকল্প তৈরি করুন এবং পাঠের মতো একই যুক্তি প্রয়োগ করুন। সবকিছু ঠিক পুনরাবৃত্তি করুন।
- অ্যাপ্লিকেশন চালু করুন.
- পোস্টম্যান ডাউনলোড এবং কনফিগার করুন (অথবা অনুরোধ পাঠানোর জন্য অন্য কোনো টুল, উদাহরণস্বরূপ, কার্ল)।
- পাঠে বর্ণিত একইভাবে POST এবং GET অনুরোধগুলি পরীক্ষা করুন৷
- PUT পরীক্ষা করুন এবং অনুরোধগুলি মুছে ফেলুন।
GO TO FULL VERSION