1. ให้ดูที่ File WSDL แล้วลบ Parameter ที่เราไม่ใช่ทิ้งไป แล้ว Generate Stub ใหม่ครับ ซึ่งจะได้เฉพาะ ฟิลด์ที่เราต้องการ อย่างเดียว (ถ้ามีที่ต้องการเอาไม่เกิน 255 ตัวแปรน่ะครับ)โดยไปลบที่ชื่อประมาณ tag <element type="xxx" name="xxx">(ซึ่งวิธีนีจะแก้กลับ Websphere 6.x ไม่ได้เพราะว่า Websphere จะมองว่า attribute มีค่า จะต้องดึงออกมาให้หมด แต่ถ้าเขาไม่ return มาให้จะทำงานได้ครับ)
2. ใช้วิธีเรียกผ่าน RPC เลย ซึ่งค่าที่ Return มานั้นจะเป็น SOAPElement (แต่จะเป็นของ Package ขึ้นอยู่กับตัว Server ที่เราทำ เช่นของ IBM จะเป็น com.ibm.ws.webservices.engine.xmlsoap.SOAPElement) แล้วเราค่อยดึงค่าอกมาคล้ายๆ กับ DOM4J หรือ JDOM
Example
//Init Service
String wsdlURL = <wsdl>;
String namespace = <namespace>;
String serviceName = <servicename>;
javax.xml.namespace.QName serviceQN = new javax.xml.namespace.QName(namespace, serviceName);
javax.xml.rpc.ServiceFactory serviceFactory = org.apache.axis.client.ServiceFactory.newInstance(); //เป็นส่วนที่ดึงค่าว่าจะใช้วิธีไหนในการ Call Web Service ซึ่งจะตามระบบที่เราเขียน และถ้าต้องการใช้เฉพาะเจาะจงไปเลยอย่าง Axis ให้อ้าง Service ที่อยู่ใน Axis ไปเลย
javax.xml.rpc.Service service = serviceFactory.createService(new java.net.URL(wsdlURL), serviceQN);
//Create Call
javax.xml.rpc.Call call = service.createCall();
call.setPortTypeName(serviceQN);
call.setOperationName(new javax.xml.namespace.QName(namespace, <operation>));
call.setPortTypeName(new javax.xml.namespace.QName(namespace , <port>));
call.setProperty(javax.xml.rpc.Call.ENCODINGSTYLE_URI_PROPERTY, "");
call.setProperty(javax.xml.rpc.Call.OPERATION_STYLE_PROPERTY, "wrapped");
Object[] reqObj = new java.lang.Object[] {<request>};
java.lang.Object _resp = call.invoke(reqObj);
คำอธิบายแต่ละตัว
1. <wsdl>คือ URL ของ WSDL ที่เราสามารถดึงออกมาได้
2. <namespace>คือ Name Space ของ WSDL นี้ โดยให้ดูที่ WSDL ที่ชื่อ targetNamespace
3. <servicename>คือ Service Name ของ WSDL นี้ โดยดูจาก wsdl:service ว่ามีชื่ออะไร
4. <operation>คือ Operation Name ของ WSDL นี้ โดยดูจาก wsdl:operation ว่ามีชื่อว่าอะไร
5. <port>คือ Port Type Name ของ WSDL นี้ โดยดูจาก wsdl:portType
0 comments:
แสดงความคิดเห็น