Nội dung
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
WordPress sử dụng xmlrpc làm web service mặc định cho hệ thống mã nguồn wordpress của nó. Xmlrpc là một cài đặt RPC (Remote Procedure Call) trên nền giao thưc HTTP, sử dụng xml để mã hóa và trao đổi dữ liệu. XML-RPC là một giao thức sử dụng trong dịch vụ web soap
được sử dụng rộng rãi trong nhiều ngôn ngữ lập trình như java, android,..php,..
Các gói/namespace được sử dụng với wordpress xml-rpc là: Blogger API, metaWeblog API, Movable Type API, Pingback API.
XML-RPC là gì?
Nếu bạn không biết khái niệm RPC thì đọc các bài viết sau đây.
– Trang chủ XML-RPC: http://www.xmlrpc.com
– XML-RPC cho người mới nhập môn:
http://davenet.scripting.com/1998/07/14/xmlRpcForNewbies
Vậy RPC là gì?
RPC là lời gọi thủ tục (hay gọi là hàm), chắc các bạn đã làm quen với việc tạo và gọi hàm. Khi một đoạn trương trình được viết lặp đi lặp lại chúng ta nhóm chúng vào một hàm hay thủ tục và gọi hàm với các tham số thích hợp. Các thủ tục hoặc hàm đó bạn có thể:
- – Để chung trong 1 file nguồn cùng với chương trình chính
- – Để trong 1 file nguồn khác và được include vào file nguồn chính khi cần,
- – Được biên dịch sẵn và để trong 1 thư viện hoặc unit để các chương trình khác của bạn (cùng được viết bằng 1 ngôn ngữ) sử dụng,
- – Được biên dịch sẵn để trong file DLL để các chương trình (được viết bằng các ngôn ngữ khác nhau) sử dụng.
Điểm chung với tất cả các phương thức trên là các hàm cần gọi đều nằm trên cùng 1 máy tính với nơi gọi chúng. Tuy nhiên nơi gọi và hàm cần gọi có thể được tách rời nhau ra: khác file, nơi gọi khác ngôn ngữ.
RPC – Remote Procedure Call dịch ra là lời gọi hàm xa, như ý tưởng ở trên hàm cần gọi và nơi gọi hàm giờ đây có thể nằm ở 2 máy tính khác nhau, ở server và một máy tính được kết nối qua internet.
Một số web service sử dụng giao thức RPC
RPC là nền tảng của lập trình phân tán (distributed programming). Các giao thức xây dựng trên RPC đã xuất hiện từ rất lâu và có thể đã trở nên quen thuộc với bạn mà bạn không để ý tới. Ví dụ:
CORBA: CORBA là một trong những giao thức được sử dụng khá phổ biến để phát triển các ứng dụng phân tán (distributed) hướng đối tượng (object-oriented). Bạn sẽ hay gặp CORBA trong các chương trình đa tầng với qui mô “xí nghiệp” (multi-tier enterprise application). Các địa chỉ tham khảo hữu ích về CORBA là trang chủ của OMG (Object Management Group) và OMG CORBA.
DCOM: Nếu bạn là tín đồ của Microsoft thì chắc hẳn là bạn không xa lạ gì với thuật ngữ này. DCOM là cú “đáp trả” của Micrsoft đối với CORBA. Bạn có thể ghé thăm trang chủ của DCOM để tìm hiểu thêm chi tiết.
SOAP: Rất có thể bạn đã nghe nhiều đến SOAP trong thời gian gần đây. SOAP cũng là một cài đặt RPC trên HTTP. Bạn có thể tìm hiểu thêm về SOAP ở trang chủ của SOAP.
XML-RPC khá đơn giản so với CORBA, DCOM và SOAP. Hơn thế, XML-RPC hoạt động khá tốt và cài đặ
t đơn giản với các ngôn ngữ lập trình phổ biến hiện nay như PHP, Perl, Python…Vì vậy XML-RPC là một lựa chọn khá thông minh cho những dự án web có quy mô nhỏ.
Và dĩ nhiên, XML-RPC vẫn có thể được cài đặt với các ngôn ngữ lập trình desktop như C/C++, Java, và thậm chí với Microsoft .NET
Ứng dụng XML-RPC trong wordpress
Vì XML-RPC là web server do đó có 2 phần: XML-RPC server và XML-RPC client.
Về cơ bản, client sử dụng XML để mã hóa tham số, và gửi XML vào XML-RPC server, dùng để gọi hàm từ xa và trả về cho XML-RPC client vói nội dung XML đã được mã hóa.
Kích hoạt XML-RPC trong wordpress
Tính năng XML-RPC trong wordpress bị ẩn mặc định, để kích hoạt xmlrpc lên bạn truy cập: Settings->Writing->remote publishing. Nếu option này chưa được bật bạn cài plugin “Control XML-RPC publishing”
Truy cập lại Settings->Write->Remote publishing with XML-RPC và chọn vào Enabled ->nhấn Save changes. Ok tính năng xmlrpc đã được kích hoạt và sẵn sàng sử dụng.
Địa chỉ rpc (endpoint) cho website wordpress của bạn là:
http://yourwordpress/xmlrpc.php
Địa chỉ XML-RPC là:
http://yourwordpress/xmlrpc.php?rsd
Test kết nối xmlrpc bằng lệnh curl. Cách làm việc này giống giao thức xmpp. Thực thi công việc thông qua việc truyền tải đoạn xml lên server bằng phương thức POST, và đây là nguyên lý khi gọi hàm. Trong ví dụ sau đây gửi nội dung xml chứa thông tin gọi hàm vào xmlrpc wordpress server.
curl -d "< ?xml version='1.0' encoding='iso-8859-1'?><methodcall><methodname>system.listMethods</methodname>< params>< /params></methodcall>" "http://localhost/wordpress/xmlrpc.php"
Trong ví dụ trên, gửi xml đến xmlrpc server có nội dung:
< ?xml version='1.0' encoding='iso-8859-1'> <methodcall> <methodname>system.listMethods</methodname> < params>< /params> </methodcall>
– Thẻ methodName xác định tên phương thức thuộc namespace system. WordPress xmlrpc cung cấp sẵn các namespace: system,demo,pingback,mt,metaWeblog,blogger,wp
– Tham số được sử dụng trong hàm, xác định bởi thẻ params
, hàm listMethods
không có đối số do đó cung cấp thẻ trống <params></params>
.
Chú ý:
- nếu bạn test trên localhost, thì sử dụng lấy tên domain là “localhost” thay vì sử dụng IP: 127.0.0.1
- Gặp lỗi
curl is not recognized as an internal or external command. Lỗi này chưa cài thư viện curl, xem cài thư viện curl
Kết quả:
Hàm Kết quả trả về danh sách cách hàm được sử dụng.
WordPress XMLRPC Server
Đăng ký hàm xmlrpc mới
Wordpress xmlrpc api có filter xmlrpc_methods
giúp bạn tạo phương thức riêng. Đăng ký hàm rpc với đoạn code sau, copy vào theme functions.php
add_filter( 'xmlrpc_methods', 'add_xml_rpc_methods' ); function add_xml_rpc_methods( $methods ) { $methods['frs.helloWorld'] = 'hello_world'; //Where frs.helloWorld is the XML-RPC method name, and hello_world is the callback, namespace 'frs' for any you want. return $methods; }
Ở ví dụ trên, chúng ta đăng ký hàm helloWorld
thuộc namespace mới frs
, và khai báo lời gọi hàm callback hello_world
cho hàm helloWorld
.
Phần định nghĩa hàm callback. Xem ví dụ mẫu:
function hello_world($params){ global $wp_xmlrpc_server; $arg1 = $params[1]; return "Hello ".$wp_xmlrpc_server->escape( $arg1 ); }
*Chú ý: Hàm cần trả về giá trị, giá trị này sẽ được lấy khi gọi hàm. Không sử dụng echo,print để xuất chuỗi ra màn hình.
Xóa hàm rpc
Tương tự như cách tạo hàm, sử dụng xmlrpc_methods
để xóa các hàm không mong muốn. Thêm vào functions.php
function mynamespace_remove_xmlrpc_methods( $methods ) { unset( $methods['demo.addTwoNumbers'] ); unset( $methods['frs.helloWorld'] ); return $methods; } add_filter( 'xmlrpc_methods', 'mynamespace_remove_xmlrpc_methods');
XMLRPC Client
Tạo lớp sử lý gọi hàm từ XMLRPC Server. Tạo lớp XMLRPC_Client
với nội dung sau:
/*create XML-RPC PHP client*/ class XMLRPC_Client { private $url; function __construct( $url ) { $this->url = $url; } /** * Call the XML-RPC method named $method and return the results, or die trying! * * @param string $method XML-RPC method name * @param mixed ... optional variable list of parameters to pass to XML-RPC call * * @return array result of XML-RPC call */ public function call() { // get arguments $params = func_get_args(); $method = array_shift( $params ); $post = xmlrpc_encode_request( $method, $params ); $ch = curl_init(); // set URL and other appropriate options curl_setopt( $ch, CURLOPT_URL, $this->url ); curl_setopt( $ch, CURLOPT_POST, true ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $post ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // issue the request $response = curl_exec( $ch ); $response_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); $curl_errorno = curl_errno( $ch ); $curl_error = curl_error( $ch ); curl_close( $ch ); // check for curl errors if ( $curl_errorno != 0 ) { die( "Curl ERROR: {$curl_errorno} - {$curl_error}n" ); } // check for server errors if ( $response_code != 200 ) { die( "ERROR: non-200 response from server: {$response_code} - {$response}n" ); } return xmlrpc_decode( $response ); } }
Gọi hàm rpc
– Kết nối tới XMLRPC Server sử dụng class XMLRPC_Client
. Tạo instance của class XMLRPC_Client
và gọi hàm rpc trên XMLRPC Server bởi phương thức call
.
//call method $client = new XMLRPC_Client( "http://127.0.0.1:81/wordpress/xmlrpc.php" ); $available_methods = $client->call( 'system.listMethods' ); print_r( $available_methods );
Lợi ích của XMLRPC là bạn có thể gọi nhiều hàm trên một kết nối XMPRPC, như ở đây chúng ta có thể gọi tiếp hàm demo.sayHello
.
$test= $client->call( 'demo.sayHello' ); print_r($test);
Xây dựng hàm RPC
Lấy giá trị tham số truyền vào hàm
function hello_world( $params ) { global $wp_xmlrpc_server; $blog_id = (int) $params[0]; // tham số đầu tiên không được sử dụng, tham số này trả về id của blog wordpress (built in XML-RPC actions) //tham số 1 $username = $params[1]; $password = $params[2]; //tham số 2 $args = $params[3]; //tham số 3 }
Truyền tương tương các tham số vào phương thức $client->call
.
$client->call( 'frs.helloWorld', 1, 'xmlrpc-user', 'xmlrpc-pass', array( 'name' => 'Justin' ) );
– Như vậy $params[1]
có giá trị ‘xmlrpc-user’, $params[2]
= ‘xmlrpc-pass’ và $params[3]
là mảng còn lại.
Escape giá trị tham số chuỗi.
$params[1]=$wp_xmlrpc_server->escape( $params[1] );
Sử lý lỗi
Một ví dụ về cách sử lý lỗi trong hàm rpc, đoạn code này kiểm tra người dùng nếu không có quyền chỉnh sửa bài viết, thì xuất lỗi 403 kèm theo tin nhắn.
function hello_world( $params ) { ... // check for edit_posts capability (requires contributor role) // (obviously not required for this simple example, but just for demonstration purposes) if ( ! current_user_can( 'edit_posts' ) ) return new IXR_Error( 403, __( 'You are not allowed access to details about orders.' ) ); ... }
Ví dụ khác sử lý lỗi 500 (thiếu tham số).
function hello_world( $params ) { ... $args = $params[3]; //giả sử tham số này là mảng // required parameter if ( ! isset( $args['name'] ) ) return new IXR_Error( 500, __( "Missing parameter 'name'" ) ); ... }
Ví dụ:
$client->call( 'frs.helloWorld', 1, 'xx', 'yy', array( 'age' => '23' ) );
– Ví dụ trên truyền thiếu tham số ‘name’ vào hàm helloWorld
, ->gặp lỗi 500.
Tạo phiên làm việc của user (verify credentials)
– WordPress RPC API có đối tượng global $wp_xmlrpc_server
giúp hàm sử dụng kết nối vào hệ thống wordpress api. Đăng nhập tài khoản user với phương thức login
.
function hello_world( $params ) { global $wp_xmlrpc_server; ... $username = $params[1]; $password = $params[2]; // verify credentials if ( ! $wp_xmlrpc_server->login( $username, $password ) ) { return $wp_xmlrpc_server->error; } ... }
– Các tin nhắn lỗi trong quá trình sử dụng wordpress api được lưu tại biến $wp_xmlrpc_server->error
.
Ví dụ gọi hàm wp.getCommentCount
để đếm comments của user. Như vậy chúng ta cần sử dụng phiên làm việc của user.
//requires a WordPress username and password to execute $client = new XMLRPC_Client( "http://localhost/wordpress/xmlrpc.php" ); $comment_count = $client->call( 'wp.getCommentCount', 1, 'user1', '123456' ); print_r( $comment_count );
Gọi hàm RPC khác từ một hàm RPC
– Thực thi action xmlrpc_call
với tên hàm cần gọi. Bằng cách này cho phép gọi hàm rpc trong hàm rpc, không cần gọi thêm một phương thức $client->call
. Điều này rất hữu ích vì đôi khi bạn cần gọi hàm trước khi sử lý đến 1 lệnh tiếp theo.
function hello_world( $params ) { ... do_action( 'xmlrpc_call', 'system.listMethods' ); ... }
Các bạn có thể tải code mẫu WP XML-RPC Demo Plugin ở file đính kèm.
Chúc bạn thành công.
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype