ມາສ້າງ RESTful Web service ດ້ວຍ Jersey ກັນ

Post Top Ad

Post Top Ad

Tuesday, September 10, 2019

ມາສ້າງ RESTful Web service ດ້ວຍ Jersey ກັນ

Jersey
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 ສຳລັບ​ລົບ​ຂໍ້​ມູນ
ຮູບ​ແບບ​ຂອງ​ຂໍ້​ມູນ​ທີ່​ໃຊ້​ສື່​ສານ​ກັນ​ຢູ່ໃນ​ຮູບ​ແບບ XML, JSON, Atom ແລະ​ອື່ນ​ໆ ອີກ​ຫລວງ​ຫລາຍ
ແຕ່​ໜຶ່ງ​ໃນ​ຮູບ​ແບບ​ທີ່​ໄດ້ຮັບ​ຄວາມ​ນິຍົມ​ຄື 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 ເປັນ​ຕົ້ນ
ໃນ​ບົດ​ຄວາມ​ນີ້ ຈະ​ເນັ້ນ​ໃນ​ເລື່ອງ Core Server ນັ້ນ​ຄື​ການສ້າງ RESTful Web service ນັ້ນ​ເອງ

ມາ​ເບິ່ງ​ຂັ້ນ​ຕອນ​ການສ້າງ​ດີກວ່າ ວ່າ​ເຮັດ​ແນວໃດ ??

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 ຈະ​ມີ​ໂຄງ​ສ້າງ​ດັ່ງ​ນີ້
Rest1

ແລະ 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 ດັ່ງ​ນີ້


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 ດັ່ງ​ນີ້
  • @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
ຜົນ​ການ​ທຳງານ
Restful2

5. ເມື່ອ​ທົດສອບ​ຜ່ານ​ຮຽບຮ້ອຍ ເຮົາ​ສາມາດ​ສັ່ງ​ໃຫ້ Start RESTful Web Service ຂຶ້ນ​ມາ​ໄດ້ ດ້ວຍ​ຄຳ​ສັ່ງ
$mvn exec:java
ຜົນ​ການ​ເຮັດ​ວຽກງານ

Restful3

ຈະ​ທຳການ start server ດ້ວຍ port 8080 ແລະ ​ສາມາດ​ເຂົ້າ​ໃຊ້​ງານ​ຜ່ານ browser ໄດ້​ດັ່ງ​ຮູບ

Restful4
ມາ​ເຖິງ​ບ່ອນ​ນີ້​ກໍ​ພໍ​ເຫັນ​ວ່າ ການ​ເລີ່ມ​ຕົ້ນ​ສ້າງ RESTful Web Service ດ້ວຍ Jersey ນັ້ນ​ກໍ​ບໍ່​ຍາກ​ຫຍັງ​ເທົ່າໃດ
ແຕ່​ຢ່າ​ເອົາ​ໄປ​ປຽບທຽບ​ກັບ​ພາສາ​ອື່ນ​ເດີ້ ເພາະ​ມັນ​ບໍ່​ສາມາດ​ປຽບທຽບ​ໄດ້​ເລຍ

ຕໍ່​ມາ ເຮົາຈະທຳການຕັ້ງ​ໂຈ​ດ​ວ່າ ຖ້າ​ເຮົາ​ຕ້ອງ​ການສ້າງ service ມີ​ຮູບ​ແບບ​ດັ່ງ​ນີ້ ຈະ​ເຮັດ​ແນວໃດ ?

  • ມີ URI / person
  • ຮອງ​ຮັບ request ທີ່​ສົ່ງ​ມາ​ຜ່ານ HTTP GET ເທົ່າ​ນັ້ນ
  • ທຳການ​ສົ່ງ​ຂໍ້​ມູນ​ຮູບ​ແບບ JSON ຊຶ່ງ​ເປັນ​ລາຍ​ລະອຽດ​ຂອງ person ປະກອບ​ໄປ​ດ້ວຍ id ແລະ name
ເລີ່ມ​ດ້ວຍທຳການ​ເພີ່ມ​ສິ່ງ​ທີ່​ຕ້ອງ​ການ​ເຂົ້າໄປ​ໃນ pom.xml ກ່ອນ ນັ້ນ​ກໍ​ຄື library ທີ່​ເຮົາ​ຕ້ອງ​ການ ຄື jersey
<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 ເລີຍ ດັ່ງ​ຮູບ
Restfult5

ດັ່ງ​ນັ້ນ ຈຶ່ງ​ທຳການສ້າງ​ໄຟ​ລ​໌ 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");
                }
}

ທຳການ​ທົດສອບ​ອີກ​ເທື່ອກໍ່ຈະ​ຜ່ານ ຊຶ່ງ​ມີ​ຜົນ​ການ​ທຳງານ​ດັ່ງ​ຮູບ
Restfult6

ຖ້າ​ບໍ່​ເຊື່ອ​ໃນ​ສິ່ງ​ທີ່​ທົດສອບ​ກໍ​ລອງ​ເຂົ້າໄປ​ເບິ່ງ​ຜົນ​ຜ່ານ browser ເຊິ່ງກໍ່ຈະໄດ້​ຜົນລັບ​ດັ່ງ​ນີ້
Restful7

ມາ​ເຖິງ​ຕອນ​ນີ້ ເຮົາ​ກໍ​ສາມາດ​ສ້າງ RESTful Web Service ຕາມ​ແບບ​ທີ່​ເຮົາ​ຕ້ອງ​ການ​ໄດ້ ໂດຍ​ເລີ່ມ​ຈາກ​ການ​ຂຽນ Test ກ່ອນ ເພື່ອລະ​ບຸ​ຂອບ​ເຂດ​ຂອງ​ບັນຫາ​ວ່າຕ້ອງ​ການ​ຈະ​ແກ້​ໄຂ​ບັນຫາ​ຫຍັງ ແລ້ວ​ຈຶ່ງ​ລົງ​ມື coding ເພື່ອ​ເຮັດໃຫ້ Test ນັ້ນ​ຜ່ານ ຊຶ່ງ​ເປັນ​ການ​ພັດທະນາ​ຕາມ​ແນວ​ຄິດ​ຂອງ Test Driven Development ແຕ່​ກໍຍັງບໍ່​ຄົບ​ຂັ້ນ​ຕອນ​ການ​ທຳງານ ເນື່ອງ​ຈາກ​ເຮົາຍັງ​ຂາດ​ການ Refactoring  code ແຕ່​ບໍ່​ເປັນ​ຫຍັງ ເນື່ອງ​ຈາກ​ຕອນ​ນີ້​ເຮົາ​ສົນ​ໃຈ​ວິທີ​ການສ້າງ RESTful Web Service ດ້ວຍ Jersey ເທົ່າ​ນັ້ນ

ແຫຼ່ງທີ່ມາ: jersey,rest, somkiat

Post Top Ad