Header Ads

Seo Services

Chào các bạn, trong bài viết trước mình đã cùng các bạn tạo một "Hello World" project với Spring Boot. Nếu bạn nào muốn tham khảo có thể xem thêm tại đây

Trong bài viết tiếp theo này mình sẽ cùng các bạn tạo một RESTful Web Service đơn giản với Spring Boot. Và đây cũng chính là một trong những chức năng rất mạnh của Spring Boot.

#Chúng ta code cái gì?

Câu hỏi đặt ra RESTful Web Service là gì? Trong khuôn khổ bài viết này mình sẽ không thể giải thích cụ thể được. Các bạn nếu chưa biết thì chỉ cần hiểu đơn giản như thế này. Giả sử mình có đường dẫn đó là http://localhost:8080/framework

Khi truy cập vào đường dẫn này mình có thể nhận được một giao diện (HTML), một đoạn text bình thường như trong ví dụ Hello World bên trên.

Nhưng trong bài viết này chúng ta sẽ không trả về hai thứ đó mà nó sẽ trả về dữ liệu dưới dạng JSON (JavaScript Object Notation).

Trả về một đối tượng: 

{id: 1, name: "ReactJS", language: "JavaScript"}

Trả về một danh sách các đối tượng:

[
    {
        "id":1,
        "name":"ReactJS",
        "language":"JavaScript"
    },
    {
        "id":2,
        "name":"Django",
        "language":"Python"
    },
    {
        "id":3,
        "name":"SpringBoot",
        "language":"Java"
    }
]
Các nền tảng khác nhau (web app, mobile app...) khi nhận được data dạng JSON này sẽ đọc, chuyển đổi và hiển thị theo các cách khác nhau lên giao diện.

Ok! lan man nãy giờ rồi, giờ vào việc chính của bài viết thôi.

#Các công cụ cần thiết

+ IDE: Eclipse (Java EE) hoặc IntelliJ Idea (Các bạn có thể dùng bất cứ IDE nào các bạn thích)

+ JDK: Ở đây mình dùng JDK 11 (các bạn có thể dùng JDK 8 hoặc các phiên bản > JDK 11)

+ Build tools: Trong bài viết này mình sử dụng Maven (các bạn có thể sử dụng Gradle hoặc các tool tương tự)

+ Hệ điều hành: Ubuntu (version 20.04) (các bạn có thể sử dụng Window hay Mac OS với những công cụ tương ứng bên trên)

#Khởi tạo ứng dụng Spring Boot.

Mình đã có một bài viết riêng cho mục này, nếu bạn nào chưa biết thì có thể tham khảo thêm trong bài viết này.

#Code thôi nào!

Nội dung file pom.xml mình thêm dependency spring-boot-starter-web như sau:

<?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.4.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.laptrinhb2a</groupId>
	<artifactId>restful-web-service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-restful-web-service</name>
	<description>Spring Boot Rest Service</description>
	<properties>
		<java.version>11</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>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>
Đầu tiên mình sẽ tạo một class để mô phỏng đối tượng cũng như dữ liệu mình trả về. Và tất nhiên đó sẽ là một POJO (Plain Old Java Object) trong Java. Cụ thể trong bài viết này mình sẽ tạo lớp Framework với 3 thuộc tính id, name, language như bên dưới.
package com.laptrinhb2a.restservice;

public class Framework {
	private long id;
	private String name;
	private String language;
	
	public Framework() {
	}
	
	public Framework(long id, String name, String language) {
		this.id = id;
		this.name = name;
		this.language = language;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}
}
Có thể nói Spring Boot bá đạo ở chỗ khi bạn trả về một object hoặc một danh sách các object nó sẽ tự động convert (chuyển đổi) đối tượng đó sang dạng JSON mà bạn không cần phải làm gì hết. 

Chính vì vậy bây giờ bạn chỉ cần làm sao viết một lớp Controller để điều hướng request khi đi vào url: http://localhost:8080/framework thì sẽ gọi đến một hàm và hàm đó trả về một đối tượng Framework là xong.
package com.laptrinhb2a.restservice;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FrameworkController {
	
	@GetMapping("/framework")
	public Framework getFramework() {
		return new Framework(1, "Spring Boot", "Java");
	}
}
Bây giờ các bạn chạy ứng dụng, mở trình duyệt lên truy cập vào đường dẫn http://localhost:8080/framework sẽ thấy dữ liệu trả về có dạng:
{"id":1, "name":"SpringBoot", "language":"Java"}
Vậy là Spring Boot đã chuyển đổi một Java Object sang dạng JSON. Câu hỏi là Spring Boot đã chuyển đổi như thế nào? Để có thể trả lời câu hỏi này một cách thấu đáo thì mình sẽ giành ra một bài viết khác. 

Trả về một đối tượng thì như vậy, còn nhiều đối tượng thì sao? Spring Boot có làm được không? Ok, mình sẽ thêm một hàm là getListFrameworks() như sau:
package com.laptrinhb2a.restservice;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FrameworkController {

	List<Framework> frameworks = new ArrayList<>();
	
	public FrameworkController() {
		frameworks.add(new Framework(1, "Spring Boot", "Java"));
		frameworks.add(new Framework(2, "ReactJS", "JavaScript"));
		frameworks.add(new Framework(3, "Django", "Python"));
	}
	
	@GetMapping("/framework")
	public Framework getFramework() {
		return new Framework(1, "Spring Boot", "Java");
	}
	
	@GetMapping("/frameworks")
	public List<Framework> getListFrameworks() {
		return frameworks;	
	}
}

Trước tiên mình sử dụng contructor để thêm vào danh sách 3 đối tượng. Sau đó trong hàm getListFrameworks() mình trả về danh sách 3 đối tượng đó. Các bạn chú ý đường dẫn lúc này là http://localhost:8080/frameworks.

Tất nhiên trong thực tế chúng ta sẽ không khởi tạo danh sách như vậy mà chúng ta sẽ lấy danh sách đó từ database chẳng hạn. Nhưng trong bài viết này để cho đơn giản nên mình khởi tạo luôn ở contructor như vậy.

Spring Boot sẽ hiểu đây là một danh sách các đối tượng và tự động chuyển đổi nó sang dạng mảng JSON.

Và khi các bạn chạy ứng dụng, truy cập vào url: http://localhost:8080/frameworks thì dữ liệu trả về sẽ có dạng như sau:
[
    {
        "id":1,
        "name":"Spring Boot",
        "language":"Java"
    },
    {
        "id":2,
        "name":"ReactJS",
        "language":"JavaScript"
    },
    {
        "id":3,
        "name":"Django",
        "language":"Python"
    }
]

Tiếp theo làm sao để chúng ta lấy ra được thông tin đầy đủ hay nói cách khác là tìm kiếm một Framework trong danh sách vừa rồi theo tên hoặc id của Framework đó. Ok, mình sẽ thêm hàm findFrameworkByName() như sau:
package com.laptrinhb2a.restservice;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FrameworkController {

	List<Framework> frameworks = new ArrayList<>();
	
	public FrameworkController() {
		frameworks.add(new Framework(1, "Spring Boot", "Java"));
		frameworks.add(new Framework(2, "ReactJS", "JavaScript"));
		frameworks.add(new Framework(3, "Django", "Python"));
	}
	
	@GetMapping("/framework")
	public Framework getFramework() {
		return new Framework(1, "Spring Boot", "Java");
	}
	
	@GetMapping("/frameworks")
	public List<Framework> getListFrameworks() {
		return frameworks;	
	}
	
	@GetMapping("/framework/{name}")
	public Framework findFrameworkByName(@PathVariable String name) {
		for(Framework framework: frameworks) {
			if(framework.getName().equals(name)) return framework;
		}
		return null;
	}
}

Ở đây có sự xuất hiện của annotation @Pathvariable. Tác dụng của @Pathvariable mình lấy ví dụ mình có đường dẫn http://localhost:8080/framework/ReactJS

Các bạn hiểu đơn giản khi vào đường dẫn này các bạn sẽ gọi hàm findFrameworkByName() và tham số name sẽ nhận giá trị là "ReactJS" được trích xuất từ url bên trên.

Ok, chạy lại chương trình sau đó truy cập vào đường dẫn bên trên các bạn sẽ nhận được một JSON object nếu tên framework bạn truyền vào tồn tại.

{id: 1, name: "Spring Boot", language: "Java"}

#Kết luận:

Vậy là trong bài viết này mình đã cùng các bạn tạo một RESTful Web Service đơn giản với Spring Boot. Có thể nói các công đoạn khó liên quan đến cấu hình, chuyển đổi đối tượng sang JSON thì Spring Boot nhà ta đã lo hết.

Vậy các bạn có thắc mắc tại sao Spring Boot làm được như vậy, công nghệ gì đứng đằng sau là gì. Các annotation có hoạt động như thế nào? Mình sẽ cùng các bạn tìm hiểu trong các bài viết tiếp theo.

Các bạn có thể download code trong bài viết tại đây

#Tham khảo

Không có nhận xét nào:

Được tạo bởi Blogger.