- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Ngày nay việc thiết kế website đã chú trọng tới Webservice, tạo dịch vụ API cho website là hướng mở để cho phép ứng dụng thứ 3 phát triển trên nhiều nền tảng ngoài WEB HTTP mà các công ty đi đầu trong lĩnh vực công nghệ thông tin luôn hướng tới.
Ví dụ: giới trẻ bây giờ tiêu tốn khá nhiều thời gian trên facebook, trước kia họ phải vào web để trò chuyện, chat chit với bạn bè giờ đây chỉ cần có trong tay chiếc smartphone là có thể sử dụng được rất nhanh chóng và tiện lợi. Bởi facebook đã phát triển ứng dụng trên android, IOS,..dựa trên các API khổng lồ mà họ tạo ra.
Xây dựng web service mất khá nhiều thời gian đòi hỏi tinh túy không thể hoàn thành trong trong ngày một ngày hai, tuy nhiên giải pháp tạo dịch vụ web service sau đây là cách đơn giản nhất đối với wordpress. Một số web service bao gồm: RESTful, Soap, ..
Trong Bài hôm nay mình sẽ hướng dẫn các bạn, cách tạo json API web service trong WordPress hay còn gọi là RESTful.
Bước đầu tiên các bạn tải plugin JSON API. Sau khi active plugin, vào trang cấu hình Settings->JSON API
JSON API có thiết kế sẵn một số hàm, ví dụ để lấy nội dung của một post/page chúng ta có địa chỉ api. Xuyên suốt hướng dẫn mình giả sử địa chỉ web wordpress là: http://localhost/wordpress
http://localhost/wordpress/api/get_post/?id=1 //hoặc sử dụng tham số post_id tương đương với tham số id http://localhost/wordpress/api/get_post/?post_id=1
– Truyền chỉ số post id vào hàm get_post. URL trả về nội dung của post dạng json. Kết quả:
{"status":"ok","post":{"id":1,"type":"post","slug":"hello-world","url":"http:\/\/localhost\/wp2\/inox\/2014\/05\/22\/hello-world\/","status":"publish","title":"Hello world!","title_plain":"Hello world!","content":"<p>Welcome to <a href=\"http:\/\/localhost\/wp2\/\">wp test1 Sites< \/a>. This is your first post. Edit or delete it, then start blogging!< \/p>\n<p> < \/p>\n","excerpt":"</p><p>Welcome to wp test1 Sites. This is your first post. Edit or delete it, then start blogging! < \/p>\n","date":"2014-05-22 02:24:32","modified":"2014-05-22 03:20:06","categories":[],"tags":[],"author":{"id":2,"slug":"inox","name":"inox","first_name":"","last_name":"","nickname":"inox","url":"","description":""},"comments":[{"id":1,"name":"Mr WordPress","url":"http:\/\/localhost\/wp2\/","date":"2014-05-22 02:24:32","content":"</p><p>Hi, this is a comment.<br \/>\nTo delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.< \/p>\n","parent":0},{"id":2,"name":"Mr WordPress","url":"http:\/\/localhost\/wp2\/","date":"2014-05-22 02:24:32","content":"</p><p>Hi, this is a comment.<br \/>\nTo delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.< \/p>\n","parent":0}],"attachments":[],"comment_count":1,"comment_status":"open","custom_fields":{}}} </p></a></p>
Mặc định api có địa chỉ: /api ,bạn có thể thay đổi địa api này tại mục “API base”. Ví dụ mình sẽ đổi “/api/” thành “/hoangwebapi/” chúng ta có địa chỉ api mới của hàm get_post là:
http://localhost/wordpress/hoangwebapi/get_post/?id=<post -id> </post>
URL API trên đã được viết lại đường dẫn, URL chưa được viết lại có dạng cấu trúc tham số, ie:
http://www.example.org/?json=get_post&post_id=47
– đây là cách gọi tường minh (Explicit Mode). Giải thích tham số:
- json: tên hàm api.
- Theo sau là các tham số sử dụng cho hàm đó.
Controllers
Các api có cùng vai trò được nhóm vào 1 file gọi là controller. Các file này chứa trong folder “controllers”. Plugin JSON API có sẵn 4 nhóm api được chia vào các files: core.php
,posts.php
,respond.php
,widgets.php
, như hình trên bạn đã thấy.
Gọi api có chỉ định rõ tên controller.
– Các hàm api thuộc core controller thì mặc định không cần chỉ định tên controller. Ví dụ sau đây là cách chỉ định controller để gọi hàm api một cách chính xác. Sửa lại URL gọi hàm get_post
:
http://localhost/wp2/inox/api/core/get_post/?id=1
Đối với cách gọi tường minh:
http://www.example.org/?json=core.get_post&post_id=1
Một ví dụ khác để lấy các recent posts. Chúng ta có URL:
http://www.example.org/api/get_recent_posts/
Một số hàm API có sẵn
Hiện tại JSON API cung cấp khoảng 21 hàm api, các bạn xem hướng dẫn tại đây nhé: Hướng dẫn các hàm JSON API
Tất cả các hàm api đã có hướng dẫn chi tiết trong file readme.txt đính kèm trong plugin. Mở file json-api/readme.txt với notepad++ và tìm từ “= Available controllers =”.
Tạo thêm hàm API
Tạo file controller mới tên “myapi.php” trong thư mục controllers. Sau đó khai báo controller vừa tạo, thêm vào theme functions.php:
add_filter('json_api_controllers', 'add_my_controller'); function add_my_controller($controllers) { // Corresponds to the class JSON_API_myapi_Controller $controllers[] = 'myapi'; return $controllers; }
– Filter json_api_controllers
dùng để khai báo controller mới. Thêm chuỗi ‘myapi’ vào mảng $controllers
plugin sẽ tìm lục file myapi.php chứa trong folder “plugins/json-api/controllers” và những controllers được khai báo ở folder khác. Nếu file không tồn tại, trong danh sách controllers sẽ báo lỗi:
Error: Cannot find controller class 'json_api_xxx_controller' (filtered path: ).
– Chú ý: Nếu bạn sử dụng JSON API plugin phiên bản mới cập nhật, thì không cần khai báo controller. Trong filter json_api_controllers
print nội dung của tham số $controllers sẽ thấy controller đã tự động khai báo. Việc khai báo thêm sẽ nhân đôi trong phần quản lý controllers.
– Địa chỉ controller sẽ là tên file chứa class controller đó. Không phân biệt viết hoa hay thường, có thể sử dụng một trong các địa chỉ của controller như sau:
http://localhost/wordpress/api/myapi/ http://localhost/wordpress/api/Myapi/ http://localhost/wordpress/api/mYapi/ http://localhost/wordpress/api/MyApi/ http://localhost/wordpress/api/MYAPI/ ...
Nếu myapi.php
nằm ngoài thư mục controllers thì khai báo đường dẫn tới controller.
add_filter('json_api_myapi_controller_path', 'Myapi_controller_path'); function Myapi_controller_path($default_path) { return '/path/to/myapi.php'; }
Chú ý:
- – Trong wordpress tất cả các hooks đều phải được viết thường , ví dụ trên nếu tên filter viết thành ‘json_api_Myapi_controller_path’ là sai, cho dù tên controller có ký tự hoa ở đầu “Myapi”.
- – Khuyến khích các controller bạn tạo ra nên đặt ngoài thư mục plugin JSON API vì nếu có update plugin này sẽ không bị mất dữ liệu.
Tạo class controller
Mở myapi.php với notepad++ khai báo thông tin controller bởi các dòng sau đây:
< ?php /* Controller name: Hoangweb API Controller description: mo ta hoangweb api. */ ?>
Định nghĩa class, tiếp tục thêm vào myapi.php
class JSON_API_Myapi_Controller { public function hello_world() { //append json vào kết quả outout : content-type: application/json return array( "message" => "Hello, world" ); } }
Tên class có dạng: JSON_API_[file-name]_Controller, trong đó [file-name] là tên file có thể viết hoa hay thường tùy ý. Như vậy class có thể chấp nhận các tên sau:
JSON_API_myapi_Controller
,
JSON_API_Myapi_Controller
,
JSON_API_MyAPI_Controller
,
JSON_API_MYAPI_Controller
,
JSON_API_mYapi_Controller
,
JSON_API_mYApI_Controller
…
Ở controller trên chúng ta tạo hàm hello_world, để gọi hàm này trên trình duyệt nhập vào địa chỉ:
http://localhost/wordpress/api/myapi/hello_world
Kết quả nhận được:
{"status":"error","error":"Unknown controller 'myapi'."}
– Chúng ta thấy dòng chữ thông báo lỗi “Unknown controller ‘myapi'” nghĩa là controller này chưa được kích hoạt. Vào Settings->JSON API tại dòng Hoangweb API nhấn vào liên kết active bên dưới. Ok bây giờ refresh lại trình duyệt. Chúng ta sẽ thấy kết quả:
{"status":"ok","message":"Hello, world"}
Chặn sử dụng hàm API
Tạm thời không phát hành hàm api hoặc chỉ đơn giản bạn muốn khóa hàm api tạm thời vì đang dở dang xây dựng. Để chặn truy cập vào một hàm nào đó chúng ta khai báo phạm vi cho hàm sửa lại là private
.
private function hello_world() { .... }
– Ngoài cách sửa đổi phạm vi của hàm JSON API có cung cấp hook để sửa đổi hàm. Chép đoạn code sau vào functions.php
add_action('json_api-myapi-hello_world', 'my_disable_func'); function my_disable_func() { exit(); }
Giải thích: khi truy cập vào api “hello_world” sẽ thực thi action tương ứng của hàm hello_world
là “json_api-myapi-hello_world”, theo thứ tự hàm này được gọi trước rồi mới đến nội dung của hello_world
. Lợi dụng tính ưu tiên này chúng ta đặt lệnh kết thúc exit()
.
Sử lý tham số cho hàm API
– Chúng ta có biến global $json_api để sử lý mọi dữ liệu, liên quan đến api. Để Lấy tham số từ URL, sử dụng cú pháp sau.
function ham1(){ global $json_api; #api/myapi/ham1/?var1=abc #api?json=myapi.ham1&var1=abc $val1 = $json_api->query->var1; //$val1='abc' #api/myapi/ham1/?var2=234 $val2 = $json_api->query->var2; //$val2='234' //tất cả các tham số lưu ở đối tượng query $json_api->query }
Tham khảo thêm về sử lý dữ liêu ở các controller mặc định.
Xuất lỗi
Mục đích Xuất lỗi thông báo về sử dụng sai api hoặc không có dữ liệu.
$json_api->error("Include a 'key' and 'value' query var."); //outout: {"status":"error","error":"Include a 'key' and 'value' query var."}
– Bạn có thể sử dụng các wordpress template tag trong quá trình xây dựng hàm api.
public function ham2(){ global $json_api; $id=$json_api->query->id; $post=get_post($id); .... }
Introspector and data models
Ngoài ra, JSON có một hàm tiện ích được nạp từ json-api/models, truy cập các hàm này thông qua introspector
.
// Retrieve posts based on custom field key/value pair public function get_custom_posts() { global $json_api; // Make sure we have key/value query vars if (!$json_api->query->key || !$json_api->query->value) { $json_api->error("Include a 'key' and 'value' query var."); } // See also: http://codex.wordpress.org/Template_Tags/query_posts $posts = $json_api->introspector->get_posts(array( 'meta_key' => $json_api->query->key, 'meta_value' => $json_api->query->value )); return array( 'key' => $key, 'value' => $value, 'posts' => $posts ); }
Configuration options
Khai báo constant trong wp-config.php để enabled mặc định một số controllers
define('JSON_API_CONTROLLERS','controller1,controller2,...'); //mỗi controller cách nhau dấu ,
Kết luận:
JSON API phù hợp với những dự án nhỏ, vì tính không đồng bộ tại sao lại vậy? môi trường chứa hàm api là độc lập, những hàm nằm ngoài môi trường đó sẽ không hoạt động. Tuy nhiên ngoài json api ra, chúng ta có dịch vụ soap-wsdl, soap là một lựa chọn tuyệt vời cho bạn xem bài viết về soap tại đây.
Chúc bạn thành công!
Nếu bạn thích bài viết này, hãy ủng hộ chúng tôi bằng cách đăng ký nhận bài viết mới ở bên dưới và đừng quên 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
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype