Displaying articles with tag web services

Testing your Web Services on Flash

Posted by PunNeng, Sun Dec 18 15:17:00 UTC 2005

Note:ผมติ๊งต่างว่าที่เข้ามาอ่านเรื่องอันนี้ มีความเข้าใจและรู้จัก Web Services ดีแล้วนะครับ

เรื่องอันนี้ทำไว้ในTFDมานานแล้ว เอามาให้ดูใหม่ ==' เนื่องจากงม AJAX อยู่ ช่วงนี้อาจจะเอาของเก่าๆ มา recycle เล่าใหม่ไปพลางๆ ก่อน

มาเริ่มกันที่ตัวอย่าง

มาดูว่าจะทำ WS บน FlashMX 2004 Pro1 ต้องรู้จักอะไรบ้าง

WSDL

เป็นตัวกำหนด state ของ WS ถูกสร้างเป็น XML ดูตัวอย่างได้ที่ http://www.webservicex.net/ConvertWeight.asmx?WSDL //WSDL ตัวนี้ผมใช้เป็น tutorial ด้วยคับ จะเป็นตัวบอก URL ของ WS ที่เราเก็บไว้ จะได้ไปเรียกใช้ถูก บอก function ที่มีอยู่ใน WS รวมถึง parameter และค่า return ของ function ด้วย ส่วนตัว source การทำงานจิงๆ เราก็เก็บไว้ใน host ที่ support กับ WS ของเรา

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
- <wsdl:port name="ConvertWeightsSoap" binding="tns:ConvertWeightsSoap">
    <soap:address location="http://www.webservicex.net/ConvertWeight.asmx" /> 
  </wsdl:port><br />
- <wsdl:port name="ConvertWeightsHttpGet" binding="tns:ConvertWeightsHttpGet">
    <http:address location="http://www.webservicex.net/ConvertWeight.asmx" /> 
  </wsdl:port>
- <wsdl:port name="ConvertWeightsHttpPost" binding="tns:ConvertWeightsHttpPost">
  <http:address location="http://www.webservicex.net/ConvertWeight.asmx" /> 
    </wsdl:port>
  </wsdl:service>

WS ConvertWeight ไปเรียกที่ URL"http://www.webservicex.net/ConvertWeight.asmx"

  1
  2
  3
  4
  5
  6
  7
  8
  9
-<s:element name="ConvertWeight">
  -<s:complexType>
    - <s:sequence>
      <s:element minOccurs="1″ maxOccurs="1″ name="Weight" type="s:double" /> 
      <s:element minOccurs="1″ maxOccurs="1″ name="FromUnit" type="s0:WeightUnit" /> 
      <s:element minOccurs="1″ maxOccurs="1″ name="ToUnit" type="s0:WeightUnit" /> 
    </s:sequence>
  </s:complexType>
</s:element>

มี function ชื่อ "ConvertWeight" รับ parameter 3 ตัว เป็น String:Weight,String:FromUnit,String:ToUnit ความหมายมันตรงตัวนะคับ คงไม่ต้องอธิบาย

  1
  2
  3
  4
  5
  6
  7
  8
-<s:element name="ConvertWeightResponse">
  -<s:complexType>
    - <s:sequence>
      <s:element minOccurs="1″ maxOccurs="1″ name="ConvertWeightResult" type="s:double" /> 
    </s:sequence>
  </s:complexType>
</s:element>
<s:element name="double" type="s:double" />

return ค่ากลับมาเป็น String:double

WebserviceConnector

Property หลักๆ ครับ WSDLURL เป็นตัวเก็บ WSDL ตัวอย่าง http://www.webservicex.net/ConvertWeight.asmx?WSDL operation เป็นตัวบอกว่า WS ของเรามี function อะไรบ้าง ที่ใช้หลักๆ ก็มีอยู่แค่นี้ suppressInvalidCalls ถ้าเป็น true เมื่อมีการทำงานผิดพลาดให้หยุดการเรียก WS ส่วนอีกตัว ไม่ขอกล่าวถึงนะครับ(เพราะยังไม่ได้ลอง) ถ้าอยากรู้ก็ลองเปิด help ดูละกัน

ยังมี property อื่นๆ อีกคับที่ต้องสั่งจาก AS คือ WebserviceConnetor.send อันนี้ต้องใช้ร่วมกับ WebserviceConnetor.param ในกรณีที่ function ของเรามีการรับ parameter ตัวอย่างครับ

  1
  2
  3
  4
  5
var wsc:Object = new Object();
var sendFunction = function (sendEnv) {
   sendEnv.target.params = [newParam_txt.text];
}; 
wsc.addEventListener('send', sendFunction);

WebserviceConnetor.result อันนี้ใช้เมื่อ function มีการ return ค่ากลับมา ตัวอย่างครับ

  1
  2
  3
  4
  5
var wsc:Object = new Object();
wsc.result = function(evt:Object) {
    _root.resultW.text = evt.target.results;
};
wsc.addEventListener('result', wscr);

WebserviceConnector.trigger(); ไว้สั่งให้ WS ทำงาน ตัวอย่างครับ//ตัวอย่างนี้เป็นตัวอย่างที่ไม่ได้เรียกใช้ WebserviceConnetor ใส่ code เอาดุ้นๆ เลย

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
import mx.data.components.WebServiceConnector;
var res:Function = function (evt:Object) {
    trace(evt.target.results);
};
var wsConn:WebServiceConnector = new WebServiceConnector();
wsConn.addEventListener('result', res);//สั่งให้รับค่า return 
//wsdl url
wsConn.WSDLURL='http://www.flash-mx.com/mm/tips/tips.cfc?wsdl';
wsConn.operation = 'getTipByProduct';//เลือก function
wsConn.params = ['Flash'];//ใส่ paremeter
//เมื่อมีการทำงานผิดพลาดให้หยุดการเรียก WS
wsConn.suppressInvalidCalls = true;
wsConn.trigger();//สั่งให้ทำงาน

ยังมองไม่เห็นกัน มาดู tutorial กันดีกว่า //เวลาทำต้อง ออนไลน์ด้วย เพราะเอาของจริงมาใช้ หนึ่ง. เปิด WebserviceConnector แล้ว config ตามรูป แล้วจัด form ตามต้องการ ตั้งชื่อ WebserviceConnector ว่า Convert zoom ตั้งชื่อ textbox ด้วยนะ ตัวบนสุดชื่อ weight ตัวล่างสุดชื่อ resultW ส่วนเจ้า ComboBox สองตัวนี้เป็น Component ครับ เลือกที่หน้าต่าง Component หรือกด Ctrl+F7 ตัวบนตั้งชื่อว่า funit ตัวล่างตั้งชื่อว่า tunit สอง. ใส่ค่าให้ ComboBox จิ้มที่ตัว ComboBox แล้วเลือกที่ property labels ดังรูป zoom จิ้มเครื่องหมาย + แล้วใส่ค่าจาก "xxxx" เช่นตัวแรกคือ Grains ใส่ตามนี้คับ มีทั้งหมด 20 ค่า//ต้องดูจาก WSDL

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
-<s:simpleType name='WeightUnit'>
  - <s:restriction base='s:string' >
    <s:enumeration value='Grains' /> 
    <s:enumeration value='Scruples' /> 
    <s:enumeration value='Carats' /> 
    <s:enumeration value='Grams' /> 
    <s:enumeration value='Pennyweight' /> 
    <s:enumeration value='DramAvoir' /> 
    <s:enumeration value='DramApoth' /> 
    <s:enumeration value='OuncesAvoir' /> 
    <s:enumeration value='OuncesTroyApoth' /> 
    <s:enumeration value='Poundals' /> 
    <s:enumeration value='PoundsTroy' /> 
    <s:enumeration value='PoundsAvoir' /> 
    <s:enumeration value='Kilograms' /> 
    <s:enumeration value='Stones' /> 
    <s:enumeration value='QuarterUS' /> 
    <s:enumeration value='Slugs' /> 
    <s:enumeration value='weight100UScwt' /> 
    <s:enumeration value='ShortTons' /> 
    <s:enumeration value='MetricTonsTonne' /> 
    <s:enumeration value='LongTons' /> 
  </s:restriction>
</s:simpleType>

ใส่ใน ComboBox ทั้ง 2 ตัวเลยนะครับ
สาม. ใส่ Code ที่ปุ่ม Convert ดังนี้

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
on(click){//พอดีผมใช้ Component ครับ ถ้าสร้างปุ่ม ก็ใช้ตามปกติ on(release)
    var wscListener:Object = new Object();
    wscListener.result = function(evt:Object) {
        //ให้ TextBox แสดงค่า
        _root.resultW.text = evt.target.results;
    };
    var wscP:Object = new Object();
    wscP.send = function(evt:Object){//ใส่ parameter
        _root.Convert.params = [_root.weight.text, _root.funit.text,_root.tunit.text];
    }
    //สั่งให้ส่ง parameter
    _root.Convert.addEventListener('send',wscP);
    //สั่งให้รับ return
    _root.Convert.addEventListener('result', wscListener);
    _root.Convert.trigger();
}

เป็นการเสร็จสิ้น อันนี้เป็น WS ที่มีคนทำไว้แล้ว ทำจาก .net เลยหา host ที่รองรับง่าย ส่วนตัวที่ผมทำไว้ ผมทำจาก java หา host ที่รองรับยังไม่ได้คับ ที่ทำไว้ทำเป็น localhost ใช้ application server เป็น jboss3.2.5

1 Flash ต้องเป็น professional version เท่านั้น

แก้ไขล่าสุด วันที่ 29 มิถุนายน 2550 เวลา 4.16 น.

0 comments | Filed Under: General | Tags: web services

codegent: we're hiring