วันพุธที่ 31 ตุลาคม พ.ศ. 2561

ทดสอบ : Select Topic Web Service

ณัฐพนธ์ รอดภักดีกุล 5801012620127

ข้อแรก ทำ Web Service ที่สามารถ

  • บันทึกข้อมูลแอร์
    • เลขห้อง
    • วันที่และเวลา
    • อุณหภูมิ
    • ความชื้น
  • ดึงข้อมูลของแอร์ทั้งหมด
  • (เพิ่มเติม) ดึงข้อมูลของแอร์ด้วยเลขห้อง
ใช้ SoapUI ในการทดสอบ WebService
ดึงข้อมูลของแอร์ด้วยเลขห้อง (เลข 45)
ดึงข้อมูล Airinfo ทั้งหมด
เพิ่ม Airinfo

Commits


first commit # ทำการสร้าง Model , สร้าง WebService Controller ตาม Tutorial ในบล็อกนี้








fix return type in get_all_airinfo # แก้ไขให้ Client ที่ชื่อ Zeep ของ python สามารถดึงข้อมูล air ได้

change datatype and function name # ทดลองใช้ WashType (type ของ library ที่ชื่อ WashOut) กับ Airinfo

add get data by room number # เพิ่มดึงข้อมูลของแอร์ด้วยเลขห้อง

ข้อสอง เพิ่มจากข้อแรก ให้สามารถดึงข้อมูล About me จาก Web Service ได้

ดึงข้อมูล About me

Commits

add get_student_info # เพิ่ม method ใน WebService Controller โดยให้ return ค่าเป็นค่าที่กำหนดไว้ (เช่น name,hobby,...)

change studentinfo type # ทำการใช้ WashType กับ StudentInfo

ข้อสาม เพิ่ม Method ใน Web Service Controller ให้สามารถ

  • เพิ่มข้อมูลพัสดุได้
    • เลขที่พัสดุ
    • ชื่อผู้รับ
    • ที่อยู่ผู้รับ
    • น้ำหนัก
    • สถานะพัสดุ (ส่งแล้ว / ยังไม่ส่ง)
  • ทำเครื่องหมายพัสดุว่าส่งแล้ว
  • (เพิ่มเติม) ดึงรายการพัสดุที่ยังไม่สง
เพิ่มข้อมูลพัสดุ

ดึงพัสดุที่ยังไม่ส่ง

ทำเครื่องหมายพัสดุที่เพิ่มไปตอนแรก

ดึงพัสดุที่ยังไม่ส่ง

Commits

add parcellist # ทำการเพิ่มโมเดล parcellists และ เพิ่ม method เพิ่ม parcel ใน Web Service

add marked parcel by parcel number # ทำเครื่องหมายพัสดุว่าส่งแล้ว

get not send parcel # ดึงข้อมูลพัสดุที่ยังไม่ส่งทั้งหมด

Client ในการทดสอบ WebService

https://gitlab.com/sovernut/select_webservice_client

Server WebService

https://gitlab.com/sovernut/select_webservice


    วันอังคารที่ 30 ตุลาคม พ.ศ. 2561

    ทดสอบ : วิชา SelecteD TopiC

    : นายสาริกข์  คำปาน 5801012610164

    31/10/2561

    https://aircondition-soap.herokuapp.com/service/wsdl
    https://bitbucket.org/sarik_kumpan/aircondition-soap/src/master/

    เตรียมอุปกรณ์ดังนี้

    -  Git
    -  Bitbucked
    - Github
    - Virtual Studio Code
    -  Ruby
         - gem wash_out
    - Ruby on Rails
    - Heroku Repository, Heroku CLI, Heroku Postgresql
    - SOAP_UI

    และเตรียมตัวมาก่อนดังนี้

    - เตรียม  Heroku Respository  ที่เชื่อมต่อกับ ฐานข้อมูล Postgresql แล้ว และ ทำการ Clone project ลง Notebook , init git,  push repository ขึ้น bitbucked ลง Gem ที่จำเป็นต้องใช้

    - เตรียม Soap ui ให้ใช้งานได้

    - เตรียม อัพเดท version ruby , ruby on rails ให้ตรงกับของ Heroku รองรับ

    * git ของ heroku และ bitbucket ต้องอัพแยกกัน
    ** ตอนทดสอบ ไม่ได้ทำฐานข้อมูลในเครื่องไว้ ดังนั้นเวลาจะทดสอบต้อง push ขึ้น Heroku ก่อน
    ซึ่งจะต้องแก้ไขภายหลัง เพราะมันจะทำให้มี การ commit เยอะ

    Commit แรก
    https://bitbucket.org/sarik_kumpan/aircondition-soap/commits/4681da82211a1a7daecc592a531e5d089818d4bf
    ข้อที่ 0 : ข้อมูล แอร์

    งานชิ้นแรกเป็น service สำหรับ เก็บข้อมูล แอร์ และ นำข้อมูล แอร์ทั้งหมดมานำเสนอ

    โดย ข้อมูล ที่ได้ จัดการทำ นั้น จะมีโครงสร้าง ที่ประกอบด้วยข้อมูลดังต่อไปนี้

     - ข้อมูลหมายเลข แอร์
     - ข้อมูล อุณหภูมิ
     - ข้อมูล ความชื้น
     - เวลาที่ เครื่องส่งออกมา
     - [ เวลาที่ database บันทึก เอง ]

    ซึ่งจาก Commit แรก นั้น มีการสร้าง ฐานข้อมูลเอาไว้อยู่แล้ว โดยใช้คำสั่งของ

    Rails เช่น rails g migrate , rails g models "name of model or table"

    ซึ่ง คำสั่งพวกนี้จะทำการสร้างไฟล์ที่จำเป็นในการใช้งาน ฐานข้อมูล ของ Rails Framwork

    ซึ่ง ถ้าหากใช้คำสั่ง Rails g models "name" จะดีที่สุด เพราะ จะมีการสร้างไฟล์

    Migrate ที่ใช้ในการสร้าง ฐานข้อมูล ครั้งแรก และการเปลี่ยนแปลงต่างๆ

    และ ไฟล์ Model ที่ ทำการ ตั้งค่า การเข้าถึงข้อมูลในฐานข้อมูลนั้นๆ และสามารถ กำหนด

    ฟังก์ชั่น ต่างๆ จำเพาะ แต่ละ Table ได้  และ ยังสร้าง ไฟล์สำหรับทดสอบ ซึ่ง ตอนนี้เราจะยังไม่ใช้งาน

    ในส่วนนี้

    ซึ่งจาก Commit แรก นั้นเราได้ทำการดัดแปลง ข้อมูล ในตาราง ฐานข้อมูล เพิ่ม

    https://bitbucket.org/sarik_kumpan/aircondition-soap/commits/4a686e5781ba665811a9918f231eb78c55e1e182

    ซึ่ง จะมีส่วนโค้ดดังนี้ในไฟล์ Migrate


    เพิ่มในส่วน ข้างล่าง ฟังก์ชั่น change ซึ่ง ตอนแรกเขา ทำมาให้อยู่แล้ว และ กำหนด ค่าใน columns

    ฐานข้อมูล ให้มีคุณสมบัติ ดังภาพ โดย t.timestamps จะเป็นการเพิ่มเวลา จากฐานข้อมูลเอง

    โดย หลังจากที่ เรา แก้ในในส่วนนี้ แล้ว เราจำเป็นต้องทำการสร้างฐานข้อมูล สำหรับ ครั้งแรกที่ใช้งาน

    การเปลี่ยนแปลง นี้ โดยใช้คำสั่ง

    - rake db:migrate
    - heroku run rake db:migrate

    โดย ขึ้นกับว่าจะ ทำการสร้างฐานข้อมูลที่ไหน ซึ่งเราใช้งานบน Heroku ดังนั้น จึงใช้คำสั่งที่ 2
    heroku run rake db:migrate

    จากนั้น ระบบ จะทำการ สั่งให้ทาง heroku สร้างฐานข้อมูล table ตามที่เราตั้งค่าเอาไว้ ให้กับ HerokuPosrgresql

    ซึ่ง จะมีการแก้ ฟังก์ชั่น ตาม commit เพื่อแก้บัคต่างๆเล็กน้อย ซึ่ง สุดท้ายแล้วจะได้ ฟังก์ชั่นสำหรับ ใช้งาน ดังนี้

    ในส่วนของการ ส่งค่าเพื่อ บันทึกเข้าฐานข้อมูล service


    ซึ่ง ในส่วนที่ กำหนด input สำหรับ soap service นี้ นั้นจะอยู่ในส่วน

    :args => { :no => :string , :temperature => :string, :humid => :string, :date_t => :string },

    โดยต้องการ จะรับ ค่าต่างๆ เช่นเลขแอร์ อุณหภูมิ ความชื้น และ เวลาต่างๆ

    และ จะ คืนค่า การอัพเดทข้อมูล ดังนี้

    :return => :string

    ซึ่งจะคืนค่าเป็น XMLที่มีคุณสมบัติเป็น String

    จากนั้นข้างใน ฟังก์ชั่น นั้น จะมีการกำหนดเงื่อนไขเช็คว่า เพิ่มข้อมูลได้มั้ยใน if else

    ซึ่งเนื้องจากใช้ฟังก์ชั่นดังนี้

    if(Aircondition.create!( :no => params[:no],:temperature => params[:temperature],:humid => params[:humid],:date_t => params[:date_t]))

    xxx.create! ซึ่ง คำสั่ง Aircondition เป็น model ที่เชื่อมกับ ฐานข้อมูลอยู่ ส่วน .create! นั้น จะคืนค่ากลับมาว่าเพิ่มสำเร็จหรือไม่

    ต่อมาในส่วนของการ อ่านค่าทั้งหมดที่อยู่ในฐานข้อมูล ส่วนนี้ เป็นส่วนที่ ค่อนข้างจะเสียเวลาไปกับการ หาวิธีส่งค่าแบบหลายๆ

    ส่วนข้อมูล มาก เพราะ soap_wash ไม่มีตัวอย่างมาให้

    สุดท้ายแล้วจะได้ผลเป็นโค้ด ดังนี้


    ซึ่งในส่วนนี้ตรงหัว ฟังก์ชั่นจะคล้ายๆเดิมคือกำหนด ว่าจะคืนค่าอะไรไปแต่เนื่องจากไม่มีความ

    ต้องการ input  จึงไม่จำเป็นต้องมี :args

     :return => [{:aircondition_info => [ {
                                :no => :integer,
                                :temp => :float,
                                :humid => :float,
                                :date => :date
                  } ] } ]
    
    
    โดย จะคืนค่าเป็น xml ที่มีหลายๆส่วน แต่เวลาจะกำหนดในโค้ดนั้นจะใช้เป็นอาเรย์ของแฮช แทน
    
    
    และในส่วนของเนื้อหาในฟังก์ชั่นจะมีดังนี้
    
    
    def get_info
       @info = Aircondition.all
       array_info = []
       @info.each do |info|
        hsh = {}
        hsh["no"] = info.no
        hsh["temp"] = info.temperature
        hsh["humid"] = info.humid
        hsh["date"] = info.date_t
        array_info.push(hsh)
       end
       render :soap =>  {:aircondition_info => array_info}
      end  
    
    
    จะมีส่วน ดึงข้อมูลทั้งหมดมาก่อน คือ
    
    
       @info = Aircondition.all

    ฐานข้อมูลจะไปดึงข้อมูลทั้งหมดในตาราง Aircondition มาให้ จากการคิวรี่ select * from Aircondition

    จาก นั้น วนลูป ในแต่ละแถวของข้อมูลนั้นๆ จับเข้า แฮชฟังก์ชั่น และ ทำเป็นอาเรย์ เอาไว้


    array_info = []
       @info.each do |info|
        hsh = {}
        hsh["no"] = info.no
        hsh["temp"] = info.temperature
        hsh["humid"] = info.humid
        hsh["date"] = info.date_t
        array_info.push(hsh)
       end


    และส่งค่ากลับไป

       render :soap =>  {:aircondition_info => array_info}
    
    ซึ่งในส่วนของ wsdl ที่ทาง wash_out generate มาให้ ก็จะมีลักษณะ ประมาณนี้


    คือมีการกำหนด schema คร่าวๆมาให้แล้ว เป็นต้น

    ก็้เป็นอันเสร็จสิ้น เมื่อทดลอง ดังนี้

    ใช้งานโดย Soap_UI
    โดยจะเริ่มจากการส่งค่าให้เข้าไปในฐานข้อมูล


    ได้รับข้อความว่า เพิ่มเสร็จแล้ว โดยเป็น soap xml จากนั้นเราจะทำการเช็คข้อมูล ว่า เพิ่มไปจริงมั้ย


    โดยใช้ soap ui เช่นเดิม จากนั้น ผลลัพธ์จะได้ดังนี้

    จะพบว่า ข้อมูลทั้งหมดถูกส่งกลับมาเป็น XML  และ รวมข้อมูลใหม่ด้วย

    ต่อมาจะลองใช้ Ruby ในการ ลองดึงข้อมูล ดูบ้าง

    require 'savon'
    require 'pp'
    client = Savon::Client.new(wsdl: "https://aircondition-soap.herokuapp.com/service/wsdl")
    result = client.call(:get_info)
    pp result.to_hash
    ได้ผลลัพธ์ดังนี้


    หรือก็คือใช้งานได้เหมือนกัน แต่ ว่า library มันดันแปลง xml เป็นรูปแบบอื่นก่อนนำมาแสดงผลแทน

    -------------------------------------------------------------------------------------------------------------------------

    ข้อที่ 1 :  ทำ service ตอบข้อมูลส่วนตัวแบบค่าตายตัว


    soap_action "you_info",
        :return => {:my_info => {
        :name => :string,
        :number => :integer,
        :hobbie => { :firsts => :string,
        :second => :string
        }
    }}

    def you_info
      @hobbie = {}
      @hobbie["firsts"] = "anime"
      @hobbie["second"] = "run"
      @info = {}
      @info[:name] = "sarik kumpan"
      @info[:number] = 5801012610164
      @info[:hobbie] = @hobbie
       render :soap => { :my_info => @info}
    end


      ก็ได้ทำมาเป็น โค้ดส่วนนี้ โดยจะใช้งานในส่วนของ gem wash_out  ช่วยในการทำให้เป็นการส่งแบบ
    Soap ซึ่ง จะใช้งานโดยการแปลงจาก Hash function เป็น ข้อมูลที่เป็น XML ให้

    โดยในส่วน

      soap_action "you_info",
                  :return => {:my_info => {
                                :name => :string,
                                :number => :integer,
                                :hobbie => { :firsts => :string,
                                            :second => :string
                                            }
                                }}

    จะเป็นส่วนกำหนด ค่า Input , Output service ที่เราต้องการ โดย

    Soap _action ตามด้วยชื่อ ฟังก์ชั่น ที่จะใช้งานการกำหนดค่าตัวนี้

    ซึ่งการกำหนดค่าตัวนี้นั้นจะทำให้การเรียกใช้งาน Soap service ตัวนี้ Package

    ที่ต้องการส่งจะมีลักษณะดังนี้


    <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:WashOut">
       <soapenv:Header/>
       <soapenv:Body>
          <urn:you_info soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
       </soapenv:Body>
    </soapenv:Envelope>

    และ ในส่วนของ Wsdl จะมีการกำหนดในส่วนของ Types มาให้แบบอัตโนมัติดังนี้
    ( ซึ่งในส่วนอื่นๆก็กำหนดมาให้เช่นกัน ) สามารถเข้าไปดูได้หลังการเปิดเซิฟเวอร์ที่
    https://aircondition-soap.herokuapp.com/service/wsdl


    ต่อมาในส่วนของ

      def you_info
        @hobbie = {}
        @hobbie["firsts"] = "anime"
        @hobbie["second"] = "run"
        @info = {}
        @info[:name] = "sarik kumpan"
        @info[:number] = 5801012610164
        @info[:hobbie] = @hobbie
        render :soap => { :my_info => @info}
       end  

    นั้นคือฟังก์ชั่นที่ ใช้ในการตอบค่ากลับ โดย จะมีการกำหนด Hash แบบตายตัวเอาไว้

    คือ มีการกำหนด Hash hobbie ที่จะมีการกำหนดค่า ต่างๆ ไว้ 2 ค่า่ และ มี Hash info

    ที่เป็น Hash รวมที่คอยเก็บค่าต่างๆ เอาไว้ และส่งกลับในทีเดียว ซึ่งค่า Hash

    ค่านี้จำเป็นต้องมีรูปแบบ ข้อมูลที่ตรงกับ การกำหนด Soap_action ก่อนหน้านี้ เท่านั้น

    ซึ่ง ในตอนที่ได้ทำการทดสอบนั้น มักจะมีปัญหา ในเรื่องของการแปลง ข้อมูล ในตรงตาม hash

    ที่กำหนด เอาไว้ เพราะ ยังไม่คุ้นชิน กับ การใช้ Gem wash_out มากนัก

    จึงทำให้เกิดหลาย Commit

    แต่สุดท้ายแล้ว จะได้ Commit ดังนี้

    https://bitbucket.org/sarik_kumpan/aircondition-soap/commits/ba7e2987cc8804e63f571e2092a4077beb266f54
    เพิ่มฟังก์ชั่น

    ส่วน Commit ที่เหลือ จะเป็นการ แก้บัคที่พยายามจะแก้ใขให้ตรงรูปแบบที่ รองรับอีกจำนวนหนึ่ง

    หลังจากนั้น จะได้ผลลัพธ์ ดังนี้

    จาก Soap_ui


    ในส่วนของ Python
    import datetime
    from zeep import Client
    client = Client('https://aircondition-soap.herokuapp.com/service/wsdl')
    print(client.service.you_info())
    ได้ผลลัพธ์ดังนี้


     และ จาก Ruby
    require 'savon'
    require 'pp'
    client = Savon::Client.new(wsdl: "https://aircondition-soap.herokuapp.com/service/wsdl")

    result = client.call(:you_info)
    pp result.to_hash

    ได้ผลลัพธ์ดังนี้




    ซึ่ง ได้ตามที่คาดหวัง แต่ ขาดแค่ การนำเสนอ ของ library ของ python , ruby ไม่นำเสนอ เป็น

    XML object ให้ดูเท่านั้น

    ------------------------------------------------------------------------------------------------------------------

    ข้อที่ 2 : ข้อมูล การให้บริการส่งสินค้า การแสดงว่าส่งหรือยัง เป็นรายการ กับการ เพิ่มรายการการส่ง

    จากในกรณี นี้ เนื้องจากต้องการเก็บข้อมูลของการ บริการ การส่งสินค้า

    ที่มีการ เก็บข้อมูล ดังนี้ เป็นหลัก



    ข้อมูลข้องผู้ส่ง ผู้รับ จุดหมายปลายทาง น้ำหนัก และ โค้ดสินค้า ที่ใช้กำหนดว่าไม่ใช่ตัวเดียวกัน และใช้

    ยืนยันสินค้าได้ และ status ที่ระบุว่า ถึงไหนแล้ว หรือส่งหรือยัง แล้วก็เวลาการบันทึก รายการจาก ตัว

    ฐานข้อมูล เอง ซึ่งในภาพ ด้านบน เป็นผลจากการ generate models และพร้อมจะไป migrate แล้ว

    ซึ่งจะอยู่ใน Commit

    https://bitbucket.org/sarik_kumpan/aircondition-soap/commits/d208b1999c6b275b4f911ce4a18bd331c9830294

    หลังจากนั้น แก้บัค การพิมไม่ตรงเงื่อนไข ต่างๆ จนได้ ผลลัพธ์ของฟังก์ชั่น การส่ง รายะเอียดการ

    สั่งสินค้า ดังนี้


    ซึ่งก็จะใช้หลักการ เหมือนกับ ข้อที่ 1 ที่จะมีการเช็คว่า มีการสร้าง ตาราง ได้หรือไม่

    แล้วจึงส่งผลลัพธ์ มา ซึ่ง จะทำการทดสอบ ด้วย Soap_ui เนื่องจากง่ายและสดวกสุด

    ดังนี้


    ตัวส่ง


     และผลการตอบกลับ


    จะเห็นได้ว่ามีการตอบกลับมาด้วย โค้ดของ การรับใช้บริการนั้นๆ ที่ได้ส่งไปใน การ

    ร้องขอรับบริการ ซึ่ง ความเป็นจริง ต้องเป็น ฝั่ง client , server gen ขึ้นมาให้

    แต่ในที่นี้เราสมมุติไปก่อน เนื่องจาก แค่ต้องการทดสอบ

    และ เมื่อมีการตอบกลับ ตรงตามที่คาดการไว้ ต่อไป ก็จะเป็นฟังก์ชั่น สำหรับ เช็ค นั้น

    จะอยู่ในขั้นตอนต่อไป ซึ่งจะมีหน้าที่ไว้ดึงข้อมูลทั้งหมดมาว่า บริการไหน ถึงขั้นตอนไหน

    เสร็จหรือ ยัง เป็นต้น

    ซึ่ง ต่อมาใน commit

    https://bitbucket.org/sarik_kumpan/aircondition-soap/commits/f716a75fe0fc3c51ad4dd8f902178d61086eba5d

    จะเป็น โค้ด ตั้งต้นที่คาดว่าควรจะใช้งานได้ แต่เกิดปัญหา ต่างๆ กับทาง heroku



    ซึ่งหลังจากลองแก้และเสีย commit ไปหลาย commit แล้ว จึงเปลี่ยนไปสร้าง โปรเจ็คสำหรับเทส ที่ใช้

    งาน sqlite บน local ได้แทน เพื่อที่จะไม่ต้อง อัพลง heroku เพื่อเทสบ่อยๆ

    และได้ ผลลัพธ์ ดังนี้

    1 . เพิ่ม class สำหรับ map ข้อมูลใน ไฟล์ model order



    2. แก้ไข ชื่อให้ตรงกัน



    ก็เป็นอันแก้ได้ โดย สุดท้าย จะได้โค้ด มา 3 ฟังก์ชั่น

    soap_action "get_info_package",
          :args => nil,
          :return => [OrderData]
    def get_info_package
       array_of_package = []
       Order.all.find_each do |package|
          hsh = {}
          hsh["code"] = package.code
          hsh["status"] = package.status
          hsh["reciver"] = package.reciver
          hsh["destination"] = package.destination
          hsh["weight"] = package.weight
          array_of_package.push(hsh)
       end
       render :soap => [ :order_imformation => array_of_package ]
    end

    soap_action "get_info_package_non_finish",
          :args => nil,
    :      return => [OrderData]
    def get_info_package_non_finish
       array_of_package = []
       Order.where(status: "store").find_each do |package|
          hsh = {}
          hsh["code"] = package.code
          hsh["status"] = package.status
          hsh["reciver"] = package.reciver
          hsh["destination"] = package.destination
          hsh["weight"] = package.weight
          array_of_package.push(hsh)
       end
       render :soap => [:order_imformation => array_of_package]
    end

    soap_action "update_status",
          :args => { :code => :string , :status => :string },
          :return => :string
    def update_status
       if params[:code].nil?
          raise SOAPError, "Code Package is empty"
       else
          package = Order.find_by code: params[:code]
          if package.nil?
             raise SOAPError, "not found package"
          else
             package.status = params[:status]
             package.save
          end
       end
       render :soap => "successfully update status package."
    end

    ซึ่งจะเป็นฟังก์ชั่นสำหรับ ดึงข้อมูลทั้งหมดสำหรับการรับให้บริการส่ง

    ฟังก์ชั่นสำหรับ การอัพเดท สถาณะ 

    ฟังก์ชั่นสำหรับ การแสดงการบริการที่มีสถาณะอยู่ในคลัง "store" หรือยังไม่ได้ส่ง

    ( ซึ่ง อาจจะมีนอกเหนือเช่น finish , กำลังส่ง, เมืองใดๆ )

    ซึ่งจากการทดลองใช้งานกับ Soap ui จะได้ผลดังนี้

    เริ่มจาก เรียกดูทั้งหมดว่าบริการใด มีสถาณะอะไร 


    จะเห็นได้ว่ามีการเก็บข้อมูล ต่างๆ เอาไว้ จากนั้นทดลองใช้คำสั่งอัพเดทค่า



    ให้ การบริการที่มี code = x005 มีสถาณะเป็น finish

    และลองใช้เช็คดูอีกรอบ




    จะพบว่าข้อมูลถูกเปลี่ยนไปแล้ว

    และต่อมาจะเช็คด้วย บริการ แสดง การส่งที่ยังไม่เสร็จ หรือมีสถาณะ store


    ผลลัพธ์ออกมาได้ถูกต้อง ว่าแสดงเฉพาะ บริการที่ยังไม่ถูกส่งไป

    ** ข้อมูลอาจจะดูไม่เรียบร้อยเนื่องจาก ช่วงแรกมีการทดลองใส่ค่าแบบรีบมากเกินไป และยังไม่ได้ลบ รวมถึง ชนิดข้อมูลด้วย ที่ได้ถูกสร้างมาในช่วงทดสอบ

    วันพุธที่ 10 ตุลาคม พ.ศ. 2561

    Tutorial 2 : รายละเอียด แอป ที่เราจะทำ

    ที่มาและหลักการ

    Project สั่งเมนูอาหารด้วยเสียง

    เป้าหมายหลักที่นำไปใช้คือร้านอาหาร ประเภท drive-through
    แนวคิดคือ ใช้ machine รับ order แทนมนุษย์



    Tutorial 4 : เพิ่มฟังก์ชั่น


    ฟังก์ชันใน Service Controller เพิ่มเติมจาก Tutorial 3

    จะเพิ่มการสร้าง Bill ขึ้นมาโดยไม่กำหนดตายตัวว่า id ต้องเป็น 1
      soap_action "create_news_order",
                  :args => { :a => :integer , :b => :integer, :c => :integer, :d => :integer },
                  :return => :string
      def create_news_order
        new_bill = Bill.create_new()
        Order.create_new(params[:a],params[:b],params[:c],params[:d],new_bill.id)
        render :soap => "create order success"
      end
    

    ฟังก์ชันสำหรับดึงวันที่ของ Bill ด้วยการส่ง id ไป
      soap_action "get_bill_by_id",
                  :args   => { :id => :integer},
                  :return => :string
      def get_bill_by_id
        render :soap =>  ((Bill.find(params[:id]))[:date])
      end
    


    รอเพิ่มเติมที่หลัง find_order_by_id

    Tutorial 3 : เริ่มสร้าง App การเพิ่ม Model controller , route

    เริ่มจากการเปิดโปรเจค งานก่อน

    พิม

    rails new appName
    เพื่อทำการสร้าง โปรเจ็ค แบบอัตโนมัติขึ้นมาก่อน


    และในการที่  เราจะทำ soap application นั้น เราจะใช้ gem wash_out

    https://github.com/inossidabile/wash_out

    ให้เข้าไปที่

    ....\appName\Gemfile

    ทำการเพิ่ม

     gem 'wash_out'

    แล้วเซฟ

    แล้วทำการใช้งาน

    bundle install

    เพื่อโหลด wash_out มาใช้งาน

    ทำการสร้างโมเดลใน Ruby On Rails 




    ทำการสร้างโมเดล shop แล้ว โดยกำหนด name เป็น string โดยพิมพ์คำสั่ง
    heroku run rails g model shop name:string

    ทำการสร้างโมเดล bill แล้ว โดยกำหนด dateเป็น dateโดยพิมพ์คำสั่ง และ refences ไปยัง shop ตาม ER Diagram ด้านบน

    heroku run rails g model bill date:date shop:references

    ทำการสร้างโมเดล orders แล้ว โดยกำหนดชื่อกาแฟเป็น integerโดยพิมพ์คำสั่ง และ references ไปยัง order
    heroku run rails g model orders espresso:integer cappuccino:integer latte:integer mocha:integer bill:references

    รัน rake db:migrate เพื่อทำการสร้างดาต้าเบส


    Routes

    จากนั้นไปที่ไฟล์ 

    ....\appName\config\routes.rb

    ทำการเพิ่ม คำสั่งดังนี้

    AppName::Application.routes.draw do
    wash_out :rumbas
    end

    โดยที่ AppName ดูได้ที่ไฟล์ application.rb (แล้วแต่การใช้งาน)

    และ service ใน แถว wash_out :service 

    นั้น คือ ชื่อไฟล์ Controller


    Controller

    ซึ่งในโฟล์เดอร์

    ...\appName\app\controllers

    สร้างไฟล์ ใหม่ชื่อ service_controller.rb และมีโค้ดดังนี้
    class ServiceController < ApplicationController
    soap_service namespace: 'urn:WashOut'

    soap_action "get_shop_name_by_id",
    :args => { :id => :integer},
    :return => :string
    def get_shop_name_by_id
    render :soap => ((Shop.find(params[:id]))[:name])
    end

    soap_action "create_news_shop",
    :args => { :name => :string},
    :return => :string
    def create_news_shop
    Shop.create_new(params[:name])
    render :soap => "create news shop success"
    end
    soap_action "create_news_order",
    :args => { :a => :boolean , :b => :boolean, :c => :boolean, :d => :boolean },
    :return => :string
    def create_news_order
    Order.create_new(params[:a],params[:b],params[:c],params[:d],1)
    render :soap => "create order success"
    end
    end

    โดย
    soap_service namespace: 'urn:WashOut'

    เป็น ส่วนที่จำเป็นต้องเพิ่มขึ้นมาเมื่อจะใช้งาน WashOut

    และจะสังเกตุได้ว่า ส่วนสำคัญจะมีการกำหนด ดังรูปแบบนี้

    soap_action "create_news_order",
    :args => { :a => :boolean , :b => :boolean, :c => :boolean, :d => :boolean },
    :return => :string
    ซึ่งจะเป็นการกำหนดชื่อ soap action และ รูปแบบ input output ต่างๆ เช่นข้างบน จะรับ ตัวแปร 4 ตัว
    เป็น ค่าความจริง เท่านั้น ทั้งหมด และ คืนค่าเป็น string กลับไป

    นั้นเอง

    และ จะมีส่วนสำคัญอีกส่วนคือ

    render :soap => "create order success"
    เพื่อคืนค่า ใน รูปแบบ soap กลับไปให้ผู้ที่ร้องขอมา

    ในส่วนของ ฐานข้อมูลนั้น

    Models

    ในไฟล์ models/order.rb
    class Order < ApplicationRecord
    belongs_to :bill

    def self.create_new(a,b,c,d,i)
    Order.create( :espresso => a,:cappuccino => b,:latte => c,:mocha => d,:bill_id => i )
    end
    end

    เพื่อรองรับฟังก์ชั่น

    Order.create_new(params[:a],params[:b],params[:c],params[:d],1)
    นั่นเอง

    และในไฟล์

    models/shop.rb

    class Shop < ApplicationRecord
    def self.create_new(name)
    Shop.create( :name => name )
    end
    end 

    ฟังก์ชั่น พวกนี้เป็นฟังก์ชั่น สำหรับทดลอง การสร้าง ร้านค้าใหม่ เพิ่มเข้าไปใน ฐานข้อมูล และดึงข้อมูลชื่อร้านค้าออกมา

    และเมื่อทุกอย่างเสร็จแล้ว

    พิม

    rails server

    บน Promtps

    เพื่อทำการเปิดเซิฟเวอร์รอให้บริการ

    ผลลัพธ์ในส่วน wsdl จะได้ผลลัพธ์ ประมาณนี้





    ในส่วนของ Client นั้น จะใช้งาน
    require 'savon'
    สำหรับ ruby เพื่อใช้งานโปรโตคอล soap

    client = Savon::Client.new(wsdl: "link ??")
    โดย เปลี่ยน ข้างในเป็น link ที่อยู่ของ wsdl

    และทำการ

    result2 = client.call(:create_news_shop, message: {:name => 'rocket'})
    เรียกใช้ soap action ดังนี้ได้เลย

    ก็เป็นอันเสร็จแล้วสำหรับ ขั้น ตอนที่ 3 เตรียม ฐานต่างๆ ขั้นตอนต่อไปจะเป็นการเพิ่ม ฟังก์ชั่นให้เรียกใช้งานได้หลากหลายขึ้น

    Tutorial 5 : deploy

    Heroku

    Heroku เป็น Platform as a Service (Paas) ที่ให้เราใช้งานได้ฟรี (มีแบบเสียเงินด้วย) โดยรองรับภาษาโปรแกรมที่หลากหลาย เช่น Ruby, PHP, Node.js, Python, Java, Clojure, Scala และยังสามารถสร้าง buildpack สำหรับภาษาอื่นๆได้ เช่น Lua ที่รันอยู่บน OpenResty ได้อีกด้วย

    ref : link


    นำ Heroku มาใช้กับงานของเรา

    ก่อนอื่นก็ทำการสมัครสมาชิก ก่อน คลิก ปุ่ม Sign up บนขวา

    จากนั้นทำการกรอกข้อมูลให้ครบถ้วน และทำการ ยืนยัน ตามขั้นตอนให้เสร็จแล้ว Login เข้ามาใช้งาน


    จากนั้นกรอกรายละเอียด




    จากนั้น จะขึ้นมาที่หน้าตานี้ 



    เนื่องจาก เราจำเป็นต้องใช้ ฐานข้อมูล ด้วย และ Heroku ไม่สามารถใช้งาน Sqlite3 ได้ จึง ต้องใช้ ตัวอื่นแทน ซึ่งในที่นี้จะใช้งาน MySQL แทน 

    gem 'mysql2', '~> 0.3.18'

    ซึ่งทำให้จำเป็นต้องแทน ที่ gem ในไฟล์ gem เก่าด้วย mysql2

    และทำการ

    bundle install
    จากนั้นไปดู ที่ หน้า resource แล้วเลือก add on พิมหา ClearDB จากนั้นเพิ่ม เข้ามา


    โดยสามารถกำหนด แผนได้ว่าจะใช้ค่าใช้จ่ายเท่าไหร่ [ อาจจะจำเป็นต้องเชื่อมบัตร เครดิต ก่อนด้วย ] 



    ให้เข้าหน้า setting แล้วไปที่ Config Vars แล้วเปลี่ยน จาก

    CLEARDB_DATABASE_URL
    ไปเป็น
    DATABASE_URL

    จากนั้น โหลด Heroku CLI จาก https://devcenter.heroku.com/articles/heroku-cli

    และ เข้าไปที่ Promtps และ พิม

    $ heroku login

    และทำการ Login ด้วย heroku id

    จากนั้น ไป ที่ ๆ มี โปรเจ็ค งาน ที่พร้อม ใช้งานแล้วจากนั้น

    git init
    heroku git:remote -a pos-service-token

    สร้าง git repo และทำการ เชื่อมโยงกับ heroku  โดย ส่วนสีแดงคือชื่อโปรเจค ที่จะอัพลงไป

    แต่นี้ยังไม่ได้่อัพ หรือ deploy เราจะเป็นต้อง

    git add *
    git commit -m "commit ??"
    git push heroku master 
    เพียงเท่านี้ ก็ทำการอัพโหลด โค้ดหรือโปรเจค ล่าสุดที่ทำการ commit แล้ว

    หาก ใช้งานหลายคน อาจจะมีการ merge กัน ได้ ควร pull มาแก้ไขก่อนใช้งานจริง

    ส่วนการใช้งานคำสั่ง command line ผ่าน heroku

    สามารถทำได้โดย

    heroku run คำสั่ง 

    ได้เลย

    และ หากมีการใช้งาน database เหมือนงานชิ้นนี้

    ก็อาจจะต้องทำการ ใช้คำสั่ง

    heroku run 'rake db:setup'

    เพื่อจัดการ ในครั้งแรก อีกด้วย ซึ่ง ในงานของเรา เนื่องจากมีการเปลี่ยน ฐานข้อมูลจาก

    sqlite3 > mysql

    รัน heruoku run rake db:migrate เพื่อทำการสร้างดาต้าเบส แทน set up


    ผลลัพธ์

    หลังจากอัพโหลด แล้ว แก้ไข ส่วนของฐานข้อมูลเสร็จแล้ว ทำการ heroku run rails server
    เพื่อทำการเปิด เซิฟเวอร์แล้วจะได้ผลลัพธ์ ดังนี้