WordPress Web service XML-RPC

Quảng cáo
Ads_ngang
Website dinhthuanit.com có bài WordPress Web service XML-RPC

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 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 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 quãng 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 những 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 theo 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ũng có thể 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 lúc này có thể nằm ngay 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 thành lập trên RPC đã xuất hiện từ rất lâu và có thể đã bị quen thuộc với bạn mà bạn không nên để ý tới. Ví dụ:

CORBA : CORBA là một trong các giao thức được dùng khá phổ biến để phát triển các phần mềm 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 điểm 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 rằng là bạn không lạ lẫm gì với thuật ngữ này. DCOM là cú “đáp trả” của Micrsoft đối với CORBA. Bạn cũng đều có thể ghé thăm trang chủ của DCOM để tìm biết thêm chi tiết.

SOAP: Rất có thể bạn đã nghe nhiều tới SOAP trong thời gian gần đây. SOAP cũng là một cài đặt RPC trên HTTP. Bạn cũng có thể có thể tìm biết 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 những ngôn ngữ lập trình phổ biến hiện giờ như PHP, Perl, Python…Vì vậy XML-RPC là một lựa chọn khá thông minh cho các dự án web có quy mô nhỏ.

Và dĩ nhiên, XML-RPC vẫn cũng có thể 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 để làm 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 thí 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 "      system.listMethods        " "http://localhost/wordpress/xmlrpc.php" 

Trong ví dụ trên, gửi xml đến xmlrpc server có nội dung:

         system.listMethods           

– Thẻ methodName định vị 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 dùng trong hàm, xác định bởi thẻ params , hàm listMethods không có đối số do đấy cung cấp thẻ trống .

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ả:
curl-xmlrpc

Hàm Kết quả trả về bản kê 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 khái niệm hàm callback. Xem tỉ 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ố trước mắt chưa đượ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ó mứ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 tỉ 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 đi cùng 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ố đâ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 lời 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 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 cấp phép gọi hàm rpc trong hàm rpc, không cần gọi thêm 1 phương thức $client-> call . Điều này rất có í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ũng có thể có thể tải code mẫu WP XML-RPC Demo Plugin ở file đính kèm.

Chúc bạn thành công.

Nếu bạn thích bài viết này, hãy cỗ vũ chúng tôi bằng phương pháp đăng ký nhận bài viết mới ở bên dưới và hãy nhớ chia sẻ kiến thức này với bạn bè của bạn nhé. Bạn cũng có thể theo dõi blog này trên Twitter và Facebook

Bài viết WordPress Web service XML-RPC được tổng hợp và biên tập bởi: dinhthuanit.com. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho dinhthuanit.com để điều chỉnh. dinhthuanit.com xin cảm ơn.

Bài Viết Liên Quan


Bài Viết Khác


Quảng cáo
Ads_ngang