Representational State Transfer
(REST) ນັ້ນຖືກເວົ້າເຖິງເທື່ອທຳອິດໃນປີ
2000
ໂດຍ Roy Thomas Fielding ຊາວອາເມຣິກາ
ເມື່ອມາເບິ່ງໃນພາສາ
Java
ເຮົາສາມາດສ້າງ REST ໄດ້ຢ່າງໃດ ສິ່ງທີ່ພົບກໍຄື ມີວິທີການສ້າງໄດ້ຫຼາກຫຼາຍແບບ
ຊຶ່ງບໍ່ເປັນມາດຕະຖານ
ດັ່ງນັ້ນໃນປີ
2008 ໄດ້ເກີດ JSR 311 ຄື JAX-RS ມີສ່ວນການທຳງານມາດຕະຖານສຳລັບສ້າງ REST
service ຂຶ້ນມາ ແລະມີ library ທີ່ສ້າງຕາມມາດຕະຖານດັ່ງກ່າວ ຄື Jersey ຊຶ່ງໄດ້ຮັບຄວາມນິຍົມຫຼາຍສຳລັບນັກພັດທະນາພາສາ
Java
ດັ່ງນັ້ນມາທຳຄວາມຮູ້ຈັກກັບ Jersey ກັນວ່າແມ່ນຫຍັງ ແລະ ເລີ່ມພັດທະນາໄດ້ຢ່າງໃດ
ພື້ນຖານຂອງ REST ນັ້ນຄື ການໃຊ້ງານ resource ຕ່າງໆ ຜ່ານ HTTP protocol, URI
ທີ່ສື່ສານໄດ້ຊັດເຈນ
ແລະ HTTP method ທີ່ເໝາະສົມ ເຊັ່ນ
- HTTP GET ສຳລັບການດຶງຂໍ້ມູນ
- HTTP POST ສຳລັບການສ້າງຂໍ້ມູນ
- HTTP PUT ສຳລັບການແກ້ໄຂຂໍ້ມູນ
- HTTP DELETE ສຳລັບລົບຂໍ້ມູນ
ແຕ່ໜຶ່ງໃນຮູບແບບທີ່ໄດ້ຮັບຄວາມນິຍົມຄື JSON
ແລ້ວ JSR 311 ແລະ Jersey ແມ່ນຫຍັງ JSR 311 ຫລື JAX-RS (
Java API for RESTful Web Service ) ໂດຍບ່ອນເຮັດວຽກກຳນົດກຸ່ມຂອງ APIs ເພື່ອສ້າງ REST Web Service ແບບງ່າຍໆ
ຖ້າເບິ່ງຍ້ອນກັບໄປກ່ອນທີ່ຈະເກີດ
JSR 311 ນີ້ຈະເຈີ library ຫລື REST framework ຕ່າງໆ ຫລວງຫລາຍ ເຊັ່ນ
Restlet ແລະ RESTEasy ທີ່ມີຮູບແບບການພັດທະນາທີ່ບໍ່ເປັນມາດຕະຖານ
ດັ່ງນັ້ນຈຶ່ງສ້າງ library ທີ່ອ້າງອິງຕາມ
JSR 311 ຂຶ້ນມາ ຊຶ່ງຕົວນັ້ນກໍຄື
Jersey ໂດຍ Jersey ປະກອບໄປດ້ວຍສ່ວນການເຮັດວຽກງານຫຼັກໆ
ດັ່ງນີ້- Core Server ມີພວກ annotation
ແລະ APIs ຕາມ JSR 311
- Core Client ຄື Client
APIs ຊ່ວຍເຮັດໃຫ້ເຮົາສາມາດຕິດຕໍ່ກັບ REST service ໄດ້ງ່າຍໆ
- Integration ຄືສ່ວນທີ່ໃຊ້ສຳລັບ integrate ທ່ານກັບ framework
ຕ່າງໆ ເຊັ່ນ Spring framework, Guice ເປັນຕົ້ນ
ມາເບິ່ງຂັ້ນຕອນການສ້າງດີກວ່າ ວ່າເຮັດແນວໃດ ??
1. ເລີ່ມດ້ວຍ Software ທີ່ຈຳເປ້ນຕ້ອງໃຊ້ງານກັນ
ກໍຄື Apache Maven ນັ້ນເອງ2. ສ້າງ project ຂອງເຮົາດ້ວຍ Apache Maven ດ້ວຍຄຳສັ່ງດັ່ງນີ້
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \ -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \ -DgroupId=com.rest.demo -DartifactId=first-demo -Dpackage=com.rest.demo \ -DarchetypeVersion=2.9 |
ຜົນການທຳງານ ຈະສ້າງ folder ຊື່ວ່າ first-demo ຂຶ້ນມາ ໂດຍໃນ folder ຈະມີໂຄງສ້າງດັ່ງນີ້
ແລະ RESTful Web Service ທີ່ເຮົາສ້າງນີ້ ຈະເຮັດວຽກຢູ່ເທິງ Grizzly container ເຊິ່ງເຮັດໃຫ້ເຮົາສາມາດ
run service ທີ່ເຮົາສ້າງຂຶ້ນມາໄດ້ທັນທີ ໂດຍບໍ່ຕ້ອງການ
Web server ອື່ນໆ ເລີຍເຮັດໃຫ້ສາມາດພັດທະນາລະບົບງານໄດ້ຢ່າງວ່ອງໄວຂຶ້ນ
3.
ເມື່ອເບິ່ງຈາກ code ທີ່ຖືກສ້າງຂຶ້ນມາຢ່າງອັດຕະໂນດ
ພົບວ່າມີ code
ທີ່ໜ້າສົນໃຈຢູ່ 2 ໄຟລ໌ກໍຄື
3.1
ໄຟລ໌ MyResourceTest.java ສຳລັບທົດສອບ
RESTful Web
Service ທີ່ເຮົາຈະສ້າງຂຶ້ນມາ
ໂດຍໃນການທົດສອບນັ້ນ ຕ້ອງການສ້າງ URI / resource ເມື່ອເອີ້ນໃຊ້ງານຜ່ານ HTTP GET ຈະຕ້ອງສົ່ງຜົນລັບ Got it! ກັບມາ ຊຶ່ງມີ code ດັ່ງນີ້
ໂດຍໃນການທົດສອບນັ້ນ ຕ້ອງການສ້າງ URI / resource ເມື່ອເອີ້ນໃຊ້ງານຜ່ານ HTTP GET ຈະຕ້ອງສົ່ງຜົນລັບ Got it! ກັບມາ ຊຶ່ງມີ code ດັ່ງນີ້
package com.rest.demo;
import
javax.ws.rs.client.Client;
import
javax.ws.rs.client.ClientBuilder;
import
javax.ws.rs.client.WebTarget;
import
org.glassfish.grizzly.http.server.HttpServer;
import
org.junit.After;
import
org.junit.Before;
import
org.junit.Test;
import static
org.junit.Assert.assertEquals;
public class
MyResourceTest {
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
server = Main.startServer();
Client c = ClientBuilder.newClient();
target = c.target(Main.BASE_URI);
}
@After
public void tearDown() throws Exception {
server.stop();
}
@Test
public void testGetIt() {
String responseMsg =
target.path("myresource").request().get(String.class);
assertEquals("Got it!",
responseMsg);
}
}
|
3.2
ໄຟລ໌ MyResource.java ຄືໄຟລ໌ສຳລັບການສ້າງ
resource ຫລື URI ຂອງ service
ທີ່ເຮົາຕ້ອງການ
ໃນການພັດທະນາຈະໃຊ້ annotation ຕ່າງໆ ຂອງ Core server ດັ່ງນີ້
ໃນການພັດທະນາຈະໃຊ້ annotation ຕ່າງໆ ຂອງ Core server ດັ່ງນີ້
- @PATH (“your path”) ຄື path
ຂອງ resource ທີ່ຕ້ອງການ ໂດຍຊື່ຂອງ path ຈະຕໍ່ຈາກ url ຫຼັກຂອງ server
ເຮົານັ້ນເອງ ເຊັ່ນ localhost:8080/myresource
- @GET ຮອງຮັບ request
ທີ່ມາຈາກ HTTP GET ເທົ່ານັ້ນ
- @Produces (MediaType.TEXT_PLAIN)
ຄືການກຳນົດ MIME type ຫລືຮູບແບບຂໍ້ມູນທີ່ຈະສົ່ງກັບໄປຜູ້ສົ່ງ request ໂດຍຈາກຕົວຢ່າງຈະສົ່ງ text ກັບໄປ ນັ້ນເອງ
package com.rest.demo;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got
it!";
}
}
|
4.
ເມື່ອທຸກຢ່າງຮຽບຮ້ອຍ ໃຫ້ທຳການທົດສອບວ່າເຮັດວຽກໄດ້ບໍດ້ວຍຄຳສັ່ງ
$mvn clean test
$mvn clean test
ຜົນການທຳງານ
5.
ເມື່ອທົດສອບຜ່ານຮຽບຮ້ອຍ ເຮົາສາມາດສັ່ງໃຫ້ Start RESTful Web Service ຂຶ້ນມາໄດ້ ດ້ວຍຄຳສັ່ງ
$mvn exec:java
$mvn exec:java
ຜົນການເຮັດວຽກງານ
ຈະທຳການ start
server ດ້ວຍ port 8080
ແລະ ສາມາດເຂົ້າໃຊ້ງານຜ່ານ browser ໄດ້ດັ່ງຮູບ
ແຕ່ຢ່າເອົາໄປປຽບທຽບກັບພາສາອື່ນເດີ້ ເພາະມັນບໍ່ສາມາດປຽບທຽບໄດ້ເລຍ
ຕໍ່ມາ ເຮົາຈະທຳການຕັ້ງໂຈດວ່າ ຖ້າເຮົາຕ້ອງການສ້າງ service ມີຮູບແບບດັ່ງນີ້ ຈະເຮັດແນວໃດ ?
- ມີ URI
/ person
- ຮອງຮັບ request
ທີ່ສົ່ງມາຜ່ານ HTTP GET ເທົ່ານັ້ນ
- ທຳການສົ່ງຂໍ້ມູນຮູບແບບ JSON ຊຶ່ງເປັນລາຍລະອຽດຂອງ
person ປະກອບໄປດ້ວຍ id
ແລະ name
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.9</version>
</dependency>
|
ຕໍ່ຈາກນັ້ນຂຽນ test ກ່ອນວ່າ ເຮົາຕ້ອງການຫຍັງ ດັ່ງນີ້
@Test
public void
getPersonDetail() {
PersonValue expectedResult =
new PersonValue(1, "UP1");
PersonValue personValue =
target.path("person").request().get(PersonValue.class);
assertEquals(expectedResult.getId(),
personValue.getId());
assertEquals(expectedResult.getName(),
personValue.getName());
}
|
ຜົນຈາກການທົດສອບຈະເຮັດວຽກຜິດພາດ
ເນື່ອງຈາກຢັງບໍ່ທຳການ implement service ເລີຍ ດັ່ງຮູບ
ດັ່ງນັ້ນ ຈຶ່ງທຳການສ້າງໄຟລ໌
Person.java
ຂຶ້ນມາ ເພື່ອເຮັດການສ້າງ resource ຂອງ service ທີ່ຕ້ອງການດັ່ງນີ້
package com.rest.demo;
import
javax.ws.rs.GET;
import
javax.ws.rs.Path;
import
javax.ws.rs.Produces;
import
javax.ws.rs.core.MediaType;
@Path("person")
public class
Person {
@GET
@Produces(MediaType.APPLICATION_JSON)
public PersonValue getAll() {
return new
PersonValue(1, "UP1");
}
}
|
ຖ້າບໍ່ເຊື່ອໃນສິ່ງທີ່ທົດສອບກໍລອງເຂົ້າໄປເບິ່ງຜົນຜ່ານ
browser ເຊິ່ງກໍ່ຈະໄດ້ຜົນລັບດັ່ງນີ້
ມາເຖິງຕອນນີ້
ເຮົາກໍສາມາດສ້າງ RESTful Web Service ຕາມແບບທີ່ເຮົາຕ້ອງການໄດ້ ໂດຍເລີ່ມຈາກການຂຽນ Test ກ່ອນ ເພື່ອລະບຸຂອບເຂດຂອງບັນຫາວ່າຕ້ອງການຈະແກ້ໄຂບັນຫາຫຍັງ
ແລ້ວຈຶ່ງລົງມື coding ເພື່ອເຮັດໃຫ້
Test
ນັ້ນຜ່ານ ຊຶ່ງເປັນການພັດທະນາຕາມແນວຄິດຂອງ
Test
Driven Development ແຕ່ກໍຍັງບໍ່ຄົບຂັ້ນຕອນການທຳງານ
ເນື່ອງຈາກເຮົາຍັງຂາດການ Refactoring code ແຕ່ບໍ່ເປັນຫຍັງ ເນື່ອງຈາກຕອນນີ້ເຮົາສົນໃຈວິທີການສ້າງ
RESTful
Web Service ດ້ວຍ Jersey ເທົ່ານັ້ນ
No comments:
Post a Comment