วันอาทิตย์ที่ 6 ธันวาคม พ.ศ. 2558

ws part 3 RESTful WS how to generate XML or JSON

>> วันนี้ได้พูดคุยเรื่องนี้กับสองท่านผู้สนใจ เริ่มจากการเรียนรู้พื้นฐานของ part ที่ผ่านมา จุดหมายของเราคือสร้างเว็บเซอร์วิสที่สามารถให้ผลลัพธ์เป็น xml หรือ json ก็ได้ผ่าน pojo สักตัวหนึ่ง

>> เราใช้ jar ทั้งหมดของ part 1 มายำกันต่อ

>> ตามหนังสือเล่มเดิมที่บอกเล่าไปแล้ว ณ part 2 ลองผิดลองถูกกันได้ความว่า
- คลาสใดๆที่ถูกประกาศด้วย @Path คือ resource
- เมธอดใดๆของคลาสที่ถูกประกาศด้วย @Path คือ subresource method
- ตัวแปรใดๆที่ต้องการส่งค่าให้ resource สามารถเขียนได้ภายใต้เครื่องหมาย { และ }
- หากการส่งค่านี้อยู่ในระดับคลาส ทุกเมธอดของคลาสก็เรียกใช้ได้ ในที่นี้เรียกด้วย @PathParam
- หากการส่งค่านี้อยู่ ณ ระดับของเมธอด เมธอดนั้นก็เป็นผู้ใช้ด้วย @PathParam เช่นเดียวกัน



>> มาดูตัวอย่างง่ายๆกันก่อน เริ่มด้วยเมธอด getBook ที่เมื่อเราร้องขอ resource ผ่าน uri ที่ว่า
localhost:8080/ch01_provider_sample_2/books
มันจึงทำงานทันทีและคืนค่ามาว่า I am a book ไม่สงสัยอะไรใช่ไหม โอเค



>> ถัดไปเราเพิ่มเมธอด getBook เข้าไปอีก คราวนี้ต้องการพารามิเตอร์หนึ่งตัวชื่อ isbn (หมายเลขระเบียนหนังสือหรือ id ของหนังสือนั่นแหละ) ก็รับเข้ามา ณ ตัวแปร bookId สุดท้ายก็ส่งค่ากลับออกไป สมมติเลข isbn คือ 1122 ผลลัพธ์จึงได้
I am a book. My Id is 1122

>> ทั้งสองเมธอดที่กล่าวใช้ชื่อเดียวกันแต่รับพารามิเตอร์ไม่เท่ากัน กล่าวคือตัวแรกไม่รับพารามิเตอร์ใดๆ เรียกเฉยๆก็ให้ค่า ส่วนตัวที่สองรับหนึ่งตัว เรียกพร้อมกับส่งพารามิเตอร์ให้ดังนี้
localhost:8080/ch01_provider_sample_2/books/1122


>> เอาล่ะ ทดสอบส่งค่าออกมาเป็น xml กันบ้าง ก็แก้ไขเมธอด getBook เดิมนี่แหละครับ ให้มันส่งออบเจ็กค์ Response ออกไป สำคัญเลย ต้องระบุไทป์หรือชนิดของผลลัพธ์ที่ต้องการด้วย @Produces ซึ่งมีความหมายว่าต้องการให้มันผลิตอะไรส่งออกไปนั่นเอง เมื่อเรียก uri เดิมเหมือนข้างต้นจึงได้ผลลัพธ์เป็น xml ทันที แหม! เขียน xml ด้วย string นี่มันหมูจริงๆ


>> เอาล่ะขยับเข้าไปใกล้ POJO กันหน่อย จาวาคลาสธรรมดาที่เราอาจใช้มันเพื่อเป็นส่วนหนึ่งของงานหลังบ้าน หรืออาจใช้มัน persist ตัวของมันกับฐานข้อมูล (ความคิด JPA โดย Hibernate) เราจึงมาจำลองกันว่าหากเรามี pojo สักตัวชื่อ Book เราจะส่งมันออกไปเป็น xml หรือ json ได้อย่างไร



>> แรกเลยเราพยายามยัดเยียดมันให้ออบเจ็กค์ Response ดังนี้ Response.ok(book).build() มัน error เลยครับ ได้ความว่ามันไม่รู้จัก application/xml ล่ะเออ (ทีสตริงธรรมดานี่เข้าใจเลยนะ)



>> แก้ไขด้วยการเพิ่ม jar เข้าไปอีก นั่นคือ jersey-media-jaxb ผลคือสำเร็จ!


>> คราวนี้เปลี่ยนเป็น json กันบ้าง มัน error อีกแล้วครับ บอกว่าไม่รู้จัก application/json (ที xml นี้รู้จักดีเลยนะเออ)

>> แก้ไขด้วยการเพิ่ม jar เข้าไปอีก นั่นคือ jersey-media-json-jackson ผลคือร้องลั่น มัน error อีก บอกว่าอยากได้ ../json/JacksonJaxbJsonProvider จึงแก้ไขด้วยการเพิ่ม jar เข้าไปให้ นั่นคือ jackson-jaxrs-json-provider

>> เหมือนจะเสร็จ ยัง ยังร้องอีก อยากได้ ../base/ProviderBase โอเคจัด jackson-jaxrs-base ให้

>> ร้องอยากได้ ../core/Versioned โอเคจัด jackson-core

>> ร้องอยากได้ ../databind/ObjectReader งั้นเอา jackson-databind

>> สุดท้ายก็ jackson-annotations เงียบเลยเธอ และออกมาแล้ววว!
{"isbn":"1122","name":"I am a book"}



>> เป็นอันว่าบรรลุเป้าหมายที่วางไว้ครับ ส่วนแผนอันใกล้เราจะสร้างฝั่ง client ที่ขอใช้บริการเหล่านี้กันหน่อยเป็นไง เพื่อที่จะนำ xml หรือ json ที่ได้จากฝั่ง service นี้มาแปลงให้เป็นคลาสออบเจ็กค์ทำงานอื่นใดต่อไป คืนนี้ฝันดี อย่าลืมอ่านหนังสือที่ให้ไว้นะ บ้ายบาย

1 ความคิดเห็น: