Tìm hiểu và ứng dụng Webservice trong PHP
Được đăng vào Tháng Mười Hai 15, 2010 bởi sangngo
Trong chuyên mục Không cụ thể | |
Tìm hiểu và ứng dụng Webservice trong PHP
**************************
1. Webservice là gì ?

* Dịch vụ web là những thành phần ứng dụng
* Dịch vụ Web giao tiếp bằng cách sử dụng giao thức mở
* Dịch vụ web được độc lập và tự mô tả
* Dịch vụ Web có thể được phát hiện bằng cách sử dụng UDDI
* Dịch vụ Web có thể được sử dụng bởi ứng dụng khác
* XML là cơ sở cho các dịch vụ Web
2. Các yếu tố nền tảng của webservices
- · SOAP (Simple Object Access Protocol): Có thể được tạm dịch là giao thức truy xuất đối tượng đơn giản. SOAP nói nôm na là một protocol mới (giống như HTTP-Get, và HTTP-Post). SOAP dựa trên nền tảng XML. SOAP là một trong những giao thức “chuẩn” cho việc xây dựng Web Services. Đụng đến Web Services thì hơi xa, nếu bạn quan tâm thì nên đi sâu nghiên cứu. Web Services phát triển trên ý tưởng RFC (Remoting function call ) tức là gọi thực hiện các hàm (functions) ở máy chủ phát tán trong hệ thống internet. Một application có thể request một dịch vụ (web service) thông qua các SOAP envelop và nhận kết quả cũng thông qua SOAP envelop. Vì SOAP dựa trên việc nến tảng XML (text-based protocol) nên rất thích hợp cho môi trường phân tán. Đặt biệt, Soap là một giao thức trao đổi thông tin giữa các ứng dụng thông qua mạng internet dựa trên XML do đó nó có thể dễ dàng vượt qua firewall giúp cho việc liên lạc trở nên dễ dàng hơn bao giờ hết. Soap đã làm điều đó như thế nào ? chúng ta cùng xem xét cấu trúc của soap để hiểu tại sao nhé.
Cấu trúc Soap:
<?xml version=”1.0″?>
<soap:Envelope
xmlns:soap=”http://www.w3.org/2001/12/soap-envelope”
soap:encodingStyle=”http://www.w3.org/2001/12/soap-encoding”>
<soap:Header>
…
</soap:Header>
<soap:Body>
…
<soap:Fault>
…
</soap:Fault>
</soap:Body>
</soap:Envelope>
Như chúng ta thấy ở trên thẻ soap:Envelope chính là gốc và là thông điệp mà soap dùng để trao đổi thông tin giữa các ứng dụng. Vì SOAP là sự kết hợp giữa HTTP và XML, nên khi làm việc với SOAP, bạn cần nắm được một số khái niệm cơ bản về XML, như namespace, XSD, DTD.
- XML Namespace: Là một giải pháp tránh xung đột giữa những phần tử trùng tên ví dụ tồn tại 2 thẻ <table> trong 1 tài liệu XML ta có thể dùng namespace để phân biệt chúng như sau: <a:table> và <b:table> trong đó a và b được gọi là XML namespaces.
- XSD - XML Schema Definition: Là một tài liệu XML có cấu trúc, quy định các thẻ được phép dùng trong thông điệp XML. Ví dụ dưới đây mô tả những quy định khi dùng thẻ address trong các thông điệp XML.
<?xml version="1.0" encoding="utf-8"?> <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Address"> <xs:complexType> <xs:sequence> <xs:element name="Recipient" type="xs:string" /> <xs:element name="House" type="xs:string" /> <xs:element name="Street" type="xs:string" /> <xs:element name="Town" type="xs:string" /> <xs:element name="County" type="xs:string" minOccurs="0" /> <xs:element name="PostCode" type="xs:string" /> <xs:element name="Country"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="FR" /> <xs:enumeration value="DE" /> <xs:enumeration value="ES" /> <xs:enumeration value="UK" /> <xs:enumeration value="US" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Đoạn XML trên mô tả như sau:Theo những quy định của bản mô tả trên thì một thông điệp XML thỏa mãn yêu cầu là: ------------------------------------ <?xml version="1.0" encoding="utf-8"?> <Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SimpleAddress.xsd"> <Recipient>Mr. Jim C.Gorge</Recipient> <House>168F</House> <Street>Featherstone Street</Street> <Town>ALASKA</Town> <PostCode>ABCD EFG</PostCode> <Country>USA</Country> </Address> -----------------------------------
- DTD - Document Type Definion: Là một tài liệu XML có cấu trúc với các phần tử và thuộc tính hợp lệ. Ví dụ:
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
]>
Các DTD và XSD được đưa vào tài liệu XML thông qua thuộc tính xmlns, từ đó tạo ra các namespace. Nhờ các namespace, vấn đề trùng tên của các phần tử trong một tài liệu XML kết hợp từ nhiều nguồn, được giải quyết một cách dễ dàng.
- · UDDI (Universal Description, Discovery and Integration): Có thể được biết như là một dịch vụ thư mục (directory service) mà các doanh nghiệp có thể đăng ký dịch vụ web của mình và tìm kiếm những cái khác.Nó chứa đựng thông tin về các dịch vụ web, và những interface của dịch vụ web này được mô tả bằng WSDL mà chúng ta sẽ được tìm hiểu ở phần tiếp theo. UDDI sử dụng Soap cho việc trao đổi thông tin và được tích hợp trong môi trường .NET.
- · WSDL (Web Services Description Language): Ngôn ngữ mô tả dịch vụ web là một ngôn ngữ được xây dựng dựa trên nền tản XML nhằm mục đích mô tả thông tin các dịch vụ web bao gồm các thông điệp (messages), phương thức (methods) và tham số của các phương thức (parameters). Ngoài ra nó còn được dùng để xác định vị trí của web services. Chúng ta có thể thấy cấu trúc của WSDL được xuất phát từ XML:
<definitions>
<types>
definition of types……..
</types>
<message>
definition of a message….
</message>
<portType>
definition of a port…….
</portType>
<binding>
definition of a binding….
</binding>
</definitions>

3. Mô hình hoạt động của Web Service
Trong mô hình hoạt động của mỗi dịch vụ web, thông thường sẽ có 3 thành phần tham gia.
- Đầu tiên là các nhà cung cấp dịch vụ, tạm gọi là Provider. Nếu bạn thuộc lớp này, công việc của bạn là xây dựng và cài đặt đối tượng dịch vụ lên 1 web server và cung cấp bản mô tả dịch vụ để hướng dẫn mọi người cách khai thác. Ngôn ngữ sử dụng cho các bản mô tả dịch vụ là SDL - Service Description Language, với cấu trúc cú pháp của XML.
- Thành phần thứ 2: các nhà khai thác dịch vụ, tạm gọi là Consumer. Nếu bạn thuộc nhóm này, công việc của bạn là xem xét bản mô tả dịch vụ của nhà cung cấp, dựa vào đó để xây dựng lớp trung gian truy xuất đối tượng dịch vụ, và cuối cùng, thiết kế giao diện cho ứng dụng.
- Thành phần thứ 3 trong chuỗi là những người dùng cuối, End - user. Họ truy cập trang web của các nhà khai thác dịch vụ, và sử dụng, một cách gián tiếp, Web Service của Provider.
=> Như vậy, Provider là người nhào bột. Consumer mang bột đó làm thành bánh và trưng bày ở các cửa hiệu. End-user đến cửa hiệu, thưởng thức bánh và thường là không cần biết ai đã nhào bột.
4. Ứng dụng webservices với ngôn ngữ PHP
PHP, ngôn ngữ lập trình hướng đối tượng có mã nguồn mở, sử dụng trên các máy chủ web, được sáng tạo bởi Rasmus Lerdorf vào năm 1994, trong hơn 10 năm qua đã trở thành niềm say mê của không ít người phát triển ứng dụng web. Những người yêu thích PHP và có tài năng, chủ yếu quy tụ ở http://www.php.net và http://www.zend.com/, không ngừng bổ sung cho PHP các tính năng mới nhằm đáp ứng với những đổi thay của công nghệ.
Để làm việc với SOAP trong PHP, bạn cần đảm bảo trình biên dịch PHP đã có extension php_soap. Kiểm tra file php.ini để đảm bảo bạn đã đáp ứng những yêu cầu cần thiết.
extension = php_soap.dll
always_populate_raw_post_data = On
Thư viện php_soap cung cấp 2 đối tượng chính: SoapServer và SoapClient. Mọi thông tin về 2 đối tượng này, bạn có thể tham khảo tại http://www.php.net/soap. SoapServer chủ yếu phục vụ cho việc xây dựng web service, cài đặt đối tượng dịch vụ web, tự động tạo ra bản mô tả dịch vụ. SoapClient chủ yếu dùng trong quá trình khai thác dịch vụ web, triệu gọi đối tượng web service và nhận phản hồi từ nhà cung cấp. Ngoài thư viện php_soap chúng ta còn có thể sử dụng các thư viện khác như: NuSOAP, PearSOAP…
Đầu tiên chúng ta sẽ tiến hành xây dựng Provider cho webservice tạo một file mới tên provider.php với nội dung:
————————————–
<?php
include(’../libs/nusoap.php’);
$server = new soap_server();
$server->configureWSDL(’Reverse String’, ‘uri:http://snlibs.googlepages.com/schema.xml’);
function Reverse($s)
{
$r=”;
for($i=1;$i<=strlen($s);$i++){
$r.=substr($s,-$i,1);
}
return $r;
}
$server->register(”Reverse”, array(’text’ => ‘xsd:string’),array(’result’ => ‘xsd:string’));
$query = isset($HTTP_RAW_POST_DATA)? $HTTP_RAW_POST_DATA : ”;
$server->service($query);
?>
————————————–
Trong đoạn code trên chúng ta sử dụng thư viện NuSOAP các bạn có thể tải về thư viện này trên mạng rất dễ. Theo đoạn code thì provider sẽ cung cấp phương thức (methods) Reverse - đảo chuổi. Nếu chúng ta thiết lập đúng thì khi chạy sẽ có màn hình như sau:

Ở trong đoạn XML trên chúng ta có sử dụng một XSD như sau:
———————————–
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs=" http://www.w3.org/2001/XMLSchema"
xmlns:tns=" http://schemas.xmlsoap.org/soap/envelope/"
targetNamespace="http://snlibs.googlepages.com/schema.xml">
<xs:element name="ReverseRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="text" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ReverseResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="result" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
————————————-
Khi chúng ta thêm ?wsdl vào phía sau địa chỉ webservice chúng ta sẽ thấy nội dung XML cung cấp:

Bây giờ chúng ta sẽ tạo một SoapClient để truy xuất dịch vụ web này, tạo file client.php với nội dung:
———————————–
<?php
$client = new SoapClient(”http://test/NuSOAP/Provider/service.php?wsdl”);
$response = $client->Reverse(’abcdef’);
echo $response;
———————————–
Các bạn chạy client.php trong localhost sẽ thấy kết quả đáng ngạc nhiên. Chúc các bạn thành công.
Phản hồi
“Tìm hiểu và ứng dụng Webservice trong PHP” có 2 Phản hồi
Viết phản hồi
Theo những quy định của bản mô tả trên thì một thông điệp XML thỏa mãn yêu cầu là:
------------------------------------









Ui chứ sao chạy thử Client.php mà không thấy gì nhỉ. Có thể trình độ IT của mình còn kém nên hy vọng sẽ được học hỏi nhiều trong ngày HD Day
Cho em hỏi nội dung của service.php?