Các bài học lập trình ứng dụng RESTful ~ Chuyên đề phát triển Web - [Chương 1] Bắt đầu Xây dựng ứng dụng trên AWS

#Học phát triển web - Phần 1: Bước đầu tiên.

Bài viết này sẽ tổng hợp những công cụ cần thiết để sử dụng trong các bài học lập trình ứng dụng RESTful ~ Chuyên đề phát triển Web.


※ Lời nói đầu.

Bài viết này được dịch từ bài [AWS上で構築するRESTfulアプリ勉強会～Web開発ワークショップ～【第1回】の当日実施内容まとめ](http://qiita.com/k_shimoji/items/d96826702ab6d6b3a1fd#study%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B) của @k_shimoji , mình sẽ viết nó theo cách mà người Việt có thể dễ dàng hiểu nó nhất những vẫn cố bám sát nội dung mà tác giả muốn truyền tải.

Trong quá trình viết tài liệu, chắc hẳn không tránh khỏi những thiếu sót hoặc liệt kê không đủ các đặc điểm, tôi sẽ vẫn tiếp tục sửa đổi và viết thêm, vì vậy các bạn hãy đọc lại bài viết này nếu mình chưa viết bài tiếp theo vì có thể mình vẫn đang bổ sung thêm nội dung cho bài viết hiện tại.
Làm ơn gửi cho chúng tôi những phản hồi nếu bạn có thắc mắc.

Một lần nữa cảm ơn các bạn đã đọc bài viết này.

#Mục lục


### Tạo Developement trên Server

1. Đăng nhập vào giao diện quản lý của AWS (Amazon Web Services)
2. Tìm và chọn AMI  (Amazon Machine Image).
3. Chọn một loại bất kỳ
4. Cài đặt nâng cao
5. Cài đặt lưu trữ
6. Tag
7. Cài đặt bảo mật cho nhóm
8. Xem lại và Xác nhận
9. Tạo key pair
10. Server đã Sẵn sàng!
11. Thử truy cập bằng trình duyệt
12. Thử truy cập bằng SSH

###Lấy tài nguyên từ GitHub

1. Fork
2. Clone tài nguyên trên development server


###Tạo một ứng dụng TO DO đơn giản

1. Cài đặt POSTMAN
2. Các bước lập trình

* Đầu tiên, tạo ra mối quan hệ giữa các hành động của URL và Controller (Quan trọng )
* URL
* Bắt đầu thực hiện
* Tóm tắt
* Dành cho các phản hồi HTTP.
* Chỉnh sửa các thủ tục trong mã nguồn.
* Tạo Branch cho development
* Viết thêm và thay đổi mã nguồn.
* Kiểm tra kết quả bằng POSTMAN
* Xác nhận sự thay đổi của database bằng phpMyAdmin
* git initial setting
* git add, commit
* push
* Chỉnh sửa các phần xung đột
* So sánh sự thay đổi của file
* File thêm vào


##Tạo Developement Server

Hệ điều hành và các phần mềm cơ bản đã được cài đặt trên AWS được gọi là AMI (Amazon Machine Image).
Bây giờ mình cần tạo một Instance EC2 của AMI đã được tạo bởi công ti của bạn. 

##Những phần mềm cần cài đặt
Bạn cần có sẵn những phần mềm sau để tạo được môi trường phát triển nhanh nhất.


| Phần mềm    | Phiên bản   |
| ------------|:-----------:| 
| apache      | 2.4.10-1.59 |
| php	      | 5.5.20-2.94 |
| mysql	      | 5.6.14-3    |
| phpMyAdmin  |	4.0.10.7-1  |
| git	      | 2.1.0       |
| xdebug      | 2.2.3-1     |


#Những thứ bạn cần chuẩn bị (Bắt buộc)

*  Tài khoản AWS
 Mình sẽ sử dụng EC2 Instance trên AWS

*  Tài khoản GitHub
 Bạn cần có tài khoản Github và đăng nhập thành công nhé

* Trình duyệt Chrome
 Những hướng dẫn của tôi dựa trên trình duyệt Google Chrome.
 Những tài liệu sau này cũng dựa trên trình duyệt Chrome, vì vậy nếu các bạn đang sử dụng trình duyệt khác mong các bạn đừng phàn nàn nếu có một số cái không hiển thị giống trình duyệt của bạn.
* POSTMAN
 Đây là một gói mở rộng (extension) và là một công cụ testing cực hữu ích cho các API mà bạn tạo ra.
[Postman - REST Client - Chrome Web Store](https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm)
Sẽ có rất nhiều công cụ tương tự, những công cụ khác cũng rất tốt nếu các bạn đã sử dụng quen, tuy nhiên những nguyên liệu và hướng dẫn dưới đây sẽ đều dựa trên công cụ POSTMAN.
* SSH command trên môi trường Hatakeru
 Nếu các bạn đang sử dụng MAC thì không cần chuẩn bị gì thêm vì trình Terminal mặc định của MAC đã đáp ứng được yêu cầu rồi.
 Với Hệ Điều Hành Windows, các bạn hãy chuẩn bị một trình Terminal khác tốt hơn. Trong tài liệu này tôi giới thiệu tới các bạn một terminal rất tốt tên là PuTTY, các bạn có thể dễ dàng tải xuống ở [PuTTY Download Page](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) tất nhiên các bạn cũng có thể sử dụng các Terminal khác mà các bạn yêu thích.
  Với Linux Server các bạn hãy sử dụng Terminal yêu thích của bạn nếu việc đăng nhập SSH thành công và không xuất hiện lỗi.
* Bạn cần sẵn sàng để học cách sử dụng Vim hoặc emacs.
 Sau khi đăng nhập vào Server thì trình soạn thảo bạn có thể sử dụng là Vim hoặc Emacs, bạn cần biết những kiến thức căn bản để sử dụng 1 trong 2 trình soạn thảo này. ( Ít nhất là các thao tác Copy và Paste, thực hiện chỉnh sửa ngay trên Terminal ).
 Cũng có những cách khác để sửa một file trên server bằng trình soạn thảo trên máy tính, ở dưới đây mình có hướng dẫn thêm cho PHPStorm. 


#Tạo Development trên Server

Bây giờ bạn sẽ tạo một Instance EC2 theo hướng dẫn dưới đây, với AMI đã chuẩn bị.
###1. Đăng nhập vào Màn hình quản trị AWS.

Sau khi đăng nhập, click vào EC2 như hướng dẫn dưới đây.
![1.png](https://qiita-image-store.s3.amazonaws.com/0/94375/d9a1e877-e24d-d162-e09b-7140347c18d0.png)

###2. Tìm AMI (machine images) để sử dụng.

Click vào AMIs như ảnh dưới, hệ thống sẽ hiện các AMI liên quan để mình chọn.
![2.png](https://qiita-image-store.s3.amazonaws.com/0/94375/280302c6-25ff-bf58-1c4d-9bd6f0f1cf3c.png)

Sau khi click, chúng ta sẽ được chuyển tới màn hình tương tự dưới đây.
Hãy chắc chắn rằng khu vực của bạn là chính xác, ở thanh trên cùng bên phải sẽ hiển thị khu vực của bạn (ở đây địa điểm của chúng tôi là Tokyo, nếu các bạn đang ở Việt Nam, các bạn có thể chọn một khu vực khác gần hơn để tăng tốc độ truy cập).

![3.png](https://qiita-image-store.s3.amazonaws.com/0/94375/32ded187-1dc9-5178-7eb8-160b1538f1ac.png)

Nếu khu vực của các bạn không như mong muốn, click vào mũi tên sổ xuống và chọn lại (trong trường hợp này tôi chọn Tokyo)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/94375/62c7a165-977a-84d3-0862-cb707d2e3a7a.png)

Hệ thống sẽ tự tìm kiếm AMI.
* Sửa filter ở khung sổ xuống đầu tiên thành [Public Images]
* Tìm kiếm bằng AMI ID ami-644f5165 (nó cũng ra kết quả tương tự nếu tìm bằng từ khóa suzukishouten).
![5.png](https://qiita-image-store.s3.amazonaws.com/0/94375/22a46f92-6378-e7de-1812-691a8cc7c1be.png)
Sau khi tìm thấy, click chọn AMI đã tìm được, click vào [Launch].
![6.png](https://qiita-image-store.s3.amazonaws.com/0/94375/c974afb0-bc5f-2854-173f-b660c79e6755.png)

Hoặc các bạn có thể sửa các cài đặt để tìm AMI khác.

###3. Chọn loại Instance

Chọn `t2.micro`, lick vào [Next].
![7.png](https://qiita-image-store.s3.amazonaws.com/0/94375/d219b711-8282-4d3d-54dd-b36decdd57f4.png)

###4. Các tùy chọn nâng cao

Các bạn có thể click [Next] luôn để sử dụng các cài đặt mặc đinh. .
Ngoài ra bạn nên check vào "Protect It is against accidental termination" để tránh việc lỡ tay click vào chấm dứt Instance, nhưng nếu check vào đó bạn sẽ không thể nào chấm dứt Instance sau này nếu không sửa nó lại thành uncheck. 
Lời khuyên của chúng tôi là check để đảm bảo an toàn.
![8.png](https://qiita-image-store.s3.amazonaws.com/0/94375/7a3ee406-475f-f367-89d7-16b6a4d15e39.png)

###5. Cài đặt lưu trữ

Phần này chúng ta có thể tăng giảm dung lượng lưu trữ. Để giữ cài đặt mặc đinh, click OK. [Next] .
![9.png](https://qiita-image-store.s3.amazonaws.com/0/94375/7dad1467-0b0e-6399-9a2c-2bce87595406.png)

###6. Tag

Chỉ cần điền vào một cái tên bạn thích ở khung value click [Next], chúng ta đang dùng tag tên là `Name`, cái này mặc định nên bạn không nên thay đổi.
※ Ví Dụ trong ảnh dưới đây tôi sử dụng value là `study_01`.
![10.png](https://qiita-image-store.s3.amazonaws.com/0/94375/c97babb5-a55c-7b31-e78a-38cb19eaccdb.png)

###7. Cài đặt bảo mật

Ở đây các bạn có thể thiết lập protocol và port để cho phép truy cập.
Điền theo các bước dưới đây:
* Chọn "Create a new security group"
* Điền tên mà bạn thích vào phần "Security group name"
* Điền một miêu tả ngắn vào ô "Description"
* Chọn SSH và bên phần Source chọn Anywhere ※
* Chọn Http và bên phần Source chọn Anywhere ※
※ ssh, http bắt buộc phải có. Nó sẽ thiết lập những port căn bản đầu tiên.
Phần "Source IP address", các bạn thiết lập là "Anywhere" như trong ảnh ( Có thể truy cập từ bất kỳ đâu). (Bạn sẽ nhận được một cảnh báo bảo mật, nhưng thời điểm này không sao cả).
Click [Review And Launch] để xem lại lần cuối trước khi chạy thử.
![11.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/03c99c6b-fc02-878b-e09f-9d3923843b34.png)

###8. Xem lại và Xác nhận

Những phần chính hầu như đã được thiết lập xong, bạn có thể xem lại và nếu không có vấn đề gì, click vào [Launch].
(Sẽ có một khung cảnh báo hiện ra như hình dưới đây nhưng không cần quan tâm đến nó)
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/63fa16ab-98c4-9596-4601-e1746a9736ce.png)

###9. Tạo key pair

Ở bước này bạn sẽ thấy một khung pop-up hiện ra yêu cầu bạn tạo một cặp key (key pair), bạn cần phải tạo ra một key pair để truy cập SSH.
Chọn `Create a new key pair` và Nhập tên của key pair để tạo keypair mới.
※ Nếu đã tạo key pair rồi và muốn sử dụng nó, Chọn `Choose an select the existing key pair`, Bạn sẽ thấy khung `Select a key pair column` hiện ra và có thể chọn trong menu sổ xuống. 

![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/ef554857-d8d4-f3c9-6c85-d3af6b669bcb.png)

Click vào [Download Key Pair], một file text sẽ được tải xuống máy tính của bạn, file này có tên giống tên keypair bạn vừa đặt và với phần mở rộng `.pem`.

Ở bước tiếp theo thì Mac và Windows chúng tôi sẽ trình bày một số sự khác nhau nhỏ. 

####1. Đối với Mac

Ở HĐH Mac và Linux, SSH Keys sẽ đều lưu dưới dạng file .ssh trong máy tính của bạn (`~/.ssh`).
File `.pem` chúng ta sẽ để ở chế độ read-only (`chmod 600`).
Thường thì với những file và thư mục bị ẩn bởi Finder, bạn có thể sử dụng terminer để làm việc, bật Terminal lên và gõ lệnh.
`ssh directory created` (Nếu chưa có từ trước)
`cd ~ /` để di chuyển về thư mục gốc, thư mục mới sẽ được tạo bởi lệnh mkdir.


```
cd ~/
mkdir .ssh
```

* Copy key file đã tải xuống

※ Tên của file chứa key tôi đã đặt nó là `study_01.pem`.

```
Đường-dẫn-đến-file-chứa-key~/.ssh/study_01.pem`
chmod 600 ~/.ssh /study_01.pem
```
####2. Đối với Windows

Đây là lúc chúng ta phải tạo kết nối bằng cách sử dụng putty.
Với putty, để convert key mà bạn đã tải xuống cho đúng với format của PuTTY, chúng ta sẽ sử dụng file sau khi convert, trước tiên hãy lưu file này ở bất cứ đâu bạn thích (Cách convert key tôi sẽ trình bày sau)
※ Ở ảnh dưới đây, tôi lưu nó thành 1 file `study_01.pem` để ngoài desktop chẳng hạn.
Quá trình chuẩn bị cho key đã tạm ổn, chúng ta đến bước tiếp theo.
Sau khi tải key về thì bạn đã có thể click [Launch Instances], click thôi.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/8c445330-4a10-6065-3587-f8dcd1041a6b.png)

### 10. Server sẵn sàng!

Nếu màn hình hiện như ảnh dưới đây thì mọi thứ đã hoàn tất, các bạn click tiếp vào  [View Instances].
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/22a8f1a8-02d7-e39b-a2d6-c7c777d50275.png)

Instance mà chúng ta đã tạo đã được hiển thị trong danh sách các instance!
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/82abac80-f1fd-5019-74e8-41db5c89ed30.png)

Để ý sang bên phải, bạn có thể thấy cột [Public IP].
Từ giờ trở đi, tất cả các truy cập từ trình duyệt hay truy cập SSH đều được xử lý cho IP này, tôi sẽ viết là PublicIP, các bạn hãy thay giá trị của IP vào nhé, mỗi lần stop và start Instance thì giá trị này sẽ thay đổi nhưng source code của instance vẫn giữ nguy.
Bạn hay xem lại màn hình này nếu quên.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/605c1e86-b8ba-5257-890d-37a28eb8ad33.png)


###11. Thử truy cập bằng trình duyệt.

http://(PublicIP)/
Khi bạn truy cập địa chỉ IP trên, trang mặc định của apache sẽ hiển thị trên màn hình.

![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/38694ccf-07fd-8e05-94ab-8015fb00fe4a.png)

###12. Thử truy cập bằng SSH

Tôi sẽ trình bày cho cả 2 trình duyệt Mac và Windows.
※ Nếu bạn đang sử dụng Linux các bạn không cần lo lắng vì nó cũng gần như giống hoàn toàn trên Mac.

####Đối với Mac

Mở terminal theo đường dẫn:
`/Applications/Utilities/Terminal`
Từ giờ mình sẽ chỉ thực hiện trên Terminal.
Chạy ssh và đăng nhập với user tên `ec2-user`.
Gõ dòng lệnh dưới đây, `ssh -i đường-dẫn-file-chứa-key tên-user@Tên-Host(Hoặc IP address). `.
Ví dụ
```
ssh -i ~/.ssh/đường-dẫn-file.pem ec2-user@GlobalIP
```
Nếu hiển thị như dưới đây thì bạn đã thành công:

```
       __ | __ | _)
        _ | (/ Amazon Linux AMI
       ___ | \ ___ | ___ |


https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
25 package (s) needed for security, out of 36 available
Run "sudo yum update" to apply all updates.
```

####Đối với Windows

Mình sử dụng terminal ngoài tên là putty.
Những hướng dẫn dưới đây tôi sẽ hướng dẫn chi tiết bằng các hình ảnh trình tự khi tôi thực hiện.
Convert key đã tải về để phù hợp với putty.

Khởi động PUTTYGEN.EXE.

![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/d8ce328e-9991-f920-17a0-1de4fda4e16e.png)

Click vào [Load].
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/fa063073-b86e-1b0d-24dc-9f62c970efeb.png)
Mặc định thì đuôi mở rộng `.pem` không hiển thị, vì vậy bạn chọn [All Files] rồi chọn file key đã tải về và mở nó ra.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/6f29b401-042c-25fe-9f2b-91332d6a2ce5.png)
Đến đây thì click Ok thôi
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/978c6238-95ee-8a6f-d725-408774615c86.png)

Click vào [Save private key]
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/e18971ac-a923-7f26-580a-af359924577e.png)

Bạn sẽ nhận được thông báo rằng không có passphrase, nhưng không sao cả, click [Yes].
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/187c065e-ca70-d288-3cd7-7867b92e8848.png)

Điền tên file và lưu lại (đuôi mở rộng sẽ là `.ppk`).
※ Ở ví dụ này tôi lưu ở desktop cho dễ nhìn, tuy nhiên bạn nên lưu ở nơi khác an toàn hơn.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/69f53eda-6667-7fc9-4b49-e7a7f9a31646.png)

####Kết nối bằng SSH.

Chạy file PUTTY.EXE.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/0dbdb101-4834-2010-2a5c-4a941fcd1eaf.png)

Chọn [Session] từ khung `Category`, điền như dưới đây.

```
HostName: ec2-user@PublicIP
Port: 22
```
Connection type: Chọn `SSH`
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/5b550765-a0e3-9ffe-2317-ac317877fd7f.png)

Tiếp tục nhìn xuống dưới của Category, Phần [Connection]>[SSH]>[Auth] 、Nhấn [Browse] để tìm đến file `.ppk` mà chúng ta đã save ra màn hình desktop vừa nãy
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/2ecd7314-195e-0b42-79a2-660637159db3.png)

Các bạn nên điền tên session ở phần Saved Sesions và nhấn save để phần mềm nhớ thông tin kết nối của bạn, qua đó không cần nhập lại ở những lần sau.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/08d251e5-0844-1930-292f-2d995cb72024.png)

Xong hết các bước các bạn click vào Open, Nếu một bảng hiện lên với thông tin như dưới đây thì OK rồi,

![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/e5bd7b9a-02f3-a509-97b0-0fd20e97ab1f.png)
Tôi muốn dụng user tên là `study`, Bởi vì `study` user đã được tạo và sẵn sàng cho việc kết nối cũng như làm việc trên nó, và trong tương lai thì mình nên làm việc trên nó hơn là `ec2-user`, vì vậy hãy sử dụng study user. Tuy nhiên có một bất cập là hiện tại mình chưa có key nào để sử dụng cho `study` user này cả.
Public key dành cho ec2-user là file key mà bạn tải về lúc nãy, ở trong đường dẫn  `/home/ec2-user/.ssh/authorized_keys`, chúng ta sẽ copy câu lệnh dưới đây và sử dụng chúng với `study` user. 
Sau khi các bạn đăng nhập thành công vào ec2-user như đã nói ở trên, chúng ta cần nắm quyền administrator (root) bằng câu lệnh:
`sudo -i`

※ lần này không yêu cầu nhập mật khẩu
Kể từ bây giờ bạn có thể copy và sử dụng public key của ec2-user cho `study` user.

```
cp /home/ec2-user/.ssh/authorized_keys /home/study/.ssh/
```
Dòng lệnh dưới đây sẽ thay đổi quyền sở hữu của key mình vừa copy.
`chown study:study /home/study/.ssh/authorized_keys`

Gõ tiếp
`ll /home/study/.ssh/authorized_keys`
Nếu trên màn hình terminal hiển thị tương tự dưới đây là OK

```
合計 4
-rw------- 1 study study 1207  1月 26 12:09 authorized_keys
```
Bây giờ bạn đã có thể đăng xuất khỏi ec2-user (Phím tắt `CTRL + d`) và thử đăng nhập với `study` user bằng lệnh:
`su study`
`ssh -i ~/.ssh/tên-file-đã-lưu.pem study@PublicIP`
Nếu có thông báo xác nhận thì nhập `yes`.
※ Mình sẽ tạo mật khẩu là `study` giống tên user

```
sudo -i
password for study:
```

Nó sẽ bắt mình nhập mật khẩu cho `study`, gõ `study`.
Kết nối SSH connection và một vài thứ khác đã sẵn sàng!
Để bảo mật tốt hơn, bạn nên đổi mật khẩu cho `study` user, chúng tôi khuyên bạn nên xóa ec2-user, dù không bắt buộc nhưng bạn nên làm vậy.

Để thay đổi mật khẩu, sau khi đăng nhập vào `study` user, bạn chỉ cần nhập lệnh `passwd`, xem ví dụ dưới đây cho dễ hình dung nhé:

```
[study@ip-172-31-8-2 ~]$ passwd
Nhập-mật-khẩu-hiện-tại-study-user
giờ thì đến phần thay đổi mật khẩu cho `study`:
Mật khẩu UNIX cũ:
Mật khẩu mới:
Xác nhận mật khẩu:
passwd: Tất cả token đã sẵn sàng cho các hoạt động tiếp theo
[study@ip-172-31-8-2 ~]$
```

Cách xóa ec2-user : đăng nhập vào `study` user và gõ lệnh `userdel` khi đang ở root, lệnh `sudo -i`để vào root như đã nói ở trên, bạn cần nhập mật khẩu chính xác, ví dụ thao tác này như sau.

```
[study@ip-172-31-8-2 ~]$ sudo -i
[sudo] password for study:
[root@ip-172-31-8-2 ~]# userdel ec2-user
[root@ip-172-31-8-2 ~]#
```
Trường hợp bạn login puTTY bằng user ec2-user từ đầu thì có thể sẽ ko xóa được, bạn cần đăng nhập lại bằng puTTY và vào người dùng là study.

#Những tài nguyên có thể lấy từ Github
##1. fork
Copy repository dưới đây vào repository của bạn trên GitHub ( thao tác này gọi là fork, nó sẽ tạo ra một repository y hệt bản gốc lên Github của bạn).
Đăng nhập vào GitHub.
Khi bạn tìm từ khóa `suzukishouten`, Bạn sẽ tìm được một repository mà chúng ta sẽ sử dụng.
※ Đây là nơi chứa các files gần như nguyên bản của CakePHP.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/6b82dc23-9e4c-9569-49da-952c63b86eb4.png)
Để đưa fork này vào tài khoản Github của bạn, chỉ cần click vào nút [Fork] như mũi tên màu đỏ dưới đây.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/dfdad522-e39c-34e8-7cfb-91e0a350b1ab.png)

##2. Clone một repository trên development server

Sau khi fork về repository của bạn, tất cả các file gốc đã được sao chép sang.
Mình sẽ clone nó là một copy của repository có URL gốc như trong khung đỏ dưới đây. Giờ chúng ta đã có thể truy cập bằng https, và copy URL bắt đầu với https.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/7239c92c-f5ba-9529-6638-f53ef635f385.png)
Nó sẽ giúp mình clone repository này về development server của bạn.
Đăng nhập `study` user bằng SSH, Gõ lệnh `cd` để di chuyển về thư mục `the/var/www/study` sau đó gõ lệnh `git clone` như các bước minh họa dưới đây. URL trong ví dụ này là trong repository của tôi, bạn cần copy chuẩn cái của bạn mà tôi đã khoanh vùng đỏ ở trên.

```
cd /var/www/study
git clone https://github.com/ks-ocean/rest-study.git ( link này của tác giả, các bạn thay đổi giống vùng khoanh đỏ nhé )
Cloning into 'rest-study'...
remote: Counting objects: 1465, done.
remote: Compressing objects: 100% (810/810), done.
remote: Total 1465 (delta 445), reused 1459 (delta 444)
Receiving objects: 100% (1465/1465), 1.73 MiB | 575.00 KiB/s, done.
Resolving deltas: 100% (445/445), done.
Checking connectivity... done.
```

Toàn bộ source đã được clone vào `/var/www/study/rest-study`.
Thử truy cập url bằng cách nhập IP vào phần (PublicIP), sau dấu gạch chép là rest-study.
`http://(PublicIP)/rest-study`
Nếu trang mặc định của CakePHP hiện ra là mình đã cài đặt thành công!.
![12.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/8dcf29d9-d487-126c-f978-d69ca0f416bc.png)

#Thử làm một app TODO đơn giản

Bây giờ chúng ta đã có thể làm một app đơn giản và xuất ra API, như các bạn đã biết với phương thức POST thì chúng ta không thể gửi dữ liệu lên trình duyệt qua thanh địa chỉ như phương thức GET để kiểm tra kết quả được, chúng ta cần một công cụ để gửi và nhận các request từ HTTP, và POSTMAN là một công cụ tuyệt vời.
##1. Cài đặt và sử dụng POSTMAN

POSTMAN là một gói mở rộng (extension) của trình duyệt Chrome, vì vậy các bạn có thể dễ dàng cài nó bằng cách nhấn nút `Thêm vào Chrome`, link của nó đây.
[Postman - REST Client - Chrome ウェブストア](https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm)
※ Sau khi cài đặt xong các bạn nhớ Bookmark nó lại để truy cập cho nhanh nhé, hiện tại bản mới nhất của POSTMAN sử dụng một ứng dụng của google để mở thay vì dùng trên trình duyệt, các bạn có thể update hoặc không, tuy nhiên bài viết này mình sẽ dùng với giao diện POSTMAN cũ. ( mà mình cũng thích bản cũ hơn )

![](https://qiita-image-store.s3.amazonaws.com/2006/65988/7488424d-9824-4044-aaf5-d0c53b990035.png)

Để thử xem một vài chức năng của nó, mình sẽ thử dùng API của Qiita xem nhé.
Điền vào ô URL `http://qiita.com/api/v2/items?page=1&per_page=20` phương thức GET
Document hướng dẫn của nó đây https://qiita.com/api/v2/docs, các bạn có thể đọc xem sao. Kết quả:

![](https://qiita-image-store.s3.amazonaws.com/2006/65988/cf9f43de-0df9-3159-881a-077014e27857.png)
Và chúng ta đã thấy giao diện hiện tại của trang qiita.com được đưa lên, giờ chúng ta bắt đầu sử dụng POSTMEN để test các API mà chúng ta tạo ra.

![](https://qiita-image-store.s3.amazonaws.com/2006/65988/eb8d9079-3fcf-76aa-c1c4-e3ba3c60f23c.png)

##2. Bắt đầu lập trình

Cuối cùng cũng đến phần chúng ta mong đợi nhất đó là bắt tay vào code.
Source mà bạn Clone từ Github nằm ở đường dẫn `/var/www/study/rest-study`.
Đăng nhập ssh và dùng lệnh `cd` để vào đúng thư mục trên trước khi bắt đầu code.
Trước tiên, chúng ta cần tìm hiểu về  URL, Controller của CakePHP Controller, và mối quan hệ tương tác giữa chúng ( rất quan trọng đấy )

Ứng dụng REST của chúng ta cần có mỗi chức năng một URL riêng, để tránh ảnh hưởng đến resource và ảnh hưởng lẫn nhau nhé.
Ví dụ
#####URL
* Danh sách các việc cần làm
`/rest-study/todo_lists.json`

* Việc thứ 1 của ID '1' trong danh sách việc cần làm ( mình gọi là Todo list )
`/rest-study/todo_lists/1.json`

Các phương thức và ý nghĩa


| Phương thức    | Ý nghĩa   |
| ------------|:-----------:| 
| POST      | Khởi tạo |
| GET	      | Đọc |
| PUT	      | Chỉnh sửa    |
| DELETE  |	Xóa  |


|URL                          | Phương thức HTTP   | Ý nghĩa   | Hành động      |
| ----------------------------|----------------|-----------|:-----------:| 
|/rest-study/todo_lists.json  | GET            | Lấy danh sách việc cần làm ( TODO List )  |index            |
|/rest-study/todo_lists/1.json| GET            | Lấy việc thứ 1 của ID thứ 1 trong TODO List  |view            |
|/rest-study/todo_lists.json  | POST	       | Thêm 1 việc vào TODO List       |add            |
|/rest-study/todo_lists/1.json| PUT	       | Chỉnh sửa việc thứ 1 của ID 1 trong TODO List |edit            |
|/rest-study/todo_lists/1.json| DELETE         | Xóa công việc thứ 1 của TODO List có ID = 1      |Delete           |

##Các phản hồi từ HTTP

API của chúng ta cũng dựa vào những phản hồi của HTTP response code, theo một luật bất thành văn quen thuộc.


* HTTP Status Codes 200-206 - Thành công
* HTTP Status Codes 300-307 - Chuyển trang
* HTTP Status Codes 400-416 - Lỗi từ Client
* HTTP Status Codes 500-505 - Lỗi từ Server

Các bạn có thể đọc chi tiết ở Wikipedia [List of HTTP status codes](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)

Ví dụ)
Khi thực hiện một thao tác bằng cách gửi request lên server, Nếu thành công (POST) sẽ phản hồi lại là "201".
Bây giờ chúng ta bắt đầu code nhé:
Những hàm khi thành công

* Tạo Branch cho development
  * Để sử dụng, cần tạo một branch mới trong git branch, các bạn chạy dòng lệnh `git branch` để xem mình đang ở branch nào.
  * Chúng ta tạm thời đặt tên cho nó là `vol/01`.
* Chỉnh sửa source.
  * Phần này chúng ta sẽ nói sau. Nên sử dụng vim hoặc emacs.
* Kiểm tra lại bằng POSTMAN
  * Khởi động POSTMAN, điền URL của API và chạy thử.
* Kiểm tra sự thay đổi của cơ sở dữ liệu bằng phpMyAdmin
  * Vào phpMyAdmin và kiểm tra các thành phần trong data.
* Thiết lập git ban dầu
  * Bạn cần đăng ký username và địa chỉ email của git.
* git add
  * Trước khi commit file lên, đây là lệnh để add các file đã thay đổi và chờ được commit.
* git commit
  * Đây là lệnh để Comit những file đã thay đổi lên repository nội bộ, nó không ảnh hưởng đến code trên GitHub.
  * Khi bạn dùng lệnh `git commit`, màn hình để nhập chú thích của sự commit này sẽ hiện lên trên vim, bạn cần có chú thích để tiếp tục lưu.
  * Nếu có vấn đề xảy ra, có thể dùng lệnh`git commit -m "commit message"` để dễ dàng hơn.
* git push
  * Lần này GitHub sẽ đòi hỏi tên và mật khẩu tài khoản để đẩy code lên server, lúc này source code của bạn trên Github sẽ thay đổi..


Toàn bộ quá trình có thể tóm gọn như sau hình ảnh dưới đây, các bạn hãy thao tác lần lượt và xem kết quả, tôi nghĩ nó đã khá dễ hiểu nên tôi sẽ không giải thích gì thêm.
Branch đã được tạo cho development
Các câu lệnh đã được thực thi
![](https://qiita-image-store.s3.amazonaws.com/2006/65988/2e08eb7e-11e1-edf4-d789-fc939df7fe48.png)

##Viết và sửa source code.

Đầu tiên chúng ta cần sửa file `app/Config/routes.php`.
※ Trong bài viết này tôi sử dụng Vim.
Các câu lệnh thực thi

```
vim app/Config/routes.php
#Copy, Paste, sửa
vim app/Controller/AppController.php
#Copy, Paste, sửa
vim app/Controller/TodoListsController.php
#Copy, Paste, sửa
vim app/Model/TodoList.php
#Copy, Paste, sửa
```

※ Trường hợp các bạn sử dụng một IDE khác để lập trình, ví dụ như PHPStorm, các bạn hãy thiết lập kết nối như sau.
* Vào File -> New project from existing files
![0.0.1.png](https://qiita-image-store.s3.amazonaws.com/0/94375/ebe28f2c-44d0-e2cb-08b0-5708ccf8800f.png)
* Chọn tùy chọn như trong hình dưới đây để kết nối với AWS:
![0.1.PNG](https://qiita-image-store.s3.amazonaws.com/0/94375/565097da-db05-f2c2-eea7-7feb15a3629b.png)
Phân Name bạn có thể điền tùy thích, Type chọn `SFTP`. Phần  SFTP Host bạn nhập IP của Instance, Username nhập `study`, Auth type chọn `Key pair ( OpenSSH or PuTTY )` sau đó Browse đến file .pem mà bạn đã tải về lúc trước, Web Server root URL nhập `IP/rest-study`, Nhấn vào Test SFTP connection để kiểm tra kết nối OK chưa, nếu nó báo thành công thì next tiếp sang trang sau.
![0.2.png](https://qiita-image-store.s3.amazonaws.com/0/94375/dbfff8f7-bb6e-21b5-5d2e-92ca1ac1d6a9.png)
Ở trang sau các bạn chọn theo thứ tự mà tôi đã đánh số, tìm đến `var/www/study/rest-study` rồi nhấn chọn nó làm Project Root và nhấn next để sang trang kế
![3.png](https://qiita-image-store.s3.amazonaws.com/0/94375/e3900642-40e3-dd13-f5a0-32d65899fe4f.png)

Bây giờ chờ nó tải toàn bộ những gì có trên project của mình trên server về thôi.
![1.png](https://qiita-image-store.s3.amazonaws.com/0/94375/280782a1-b56b-fe05-e242-7705b46a1807.png)

Để những thay đổi của mình được tự động upload lên server ở mỗi lần lưu các bạn vào Tools, Developement -> tích vào Automatic Upload.
![2.png](https://qiita-image-store.s3.amazonaws.com/0/94375/c444aee6-67fd-d277-ccc9-01703613ffa0.png)




Tôi đã copy và paste các phần của code đúng vào như dưới đây. Màn hình chỉnh sửa `app/Config/routes.php` như ảnh dưới đây .

![](https://qiita-image-store.s3.amazonaws.com/2006/65988/64f50d2b-69e1-9298-74df-cc4158c1b112.png)

####Các phần của Source đã chuẩn

Trước khi đóng những file cố định này này, Những file bị thay đổi nội dung: 
`app/Config/routes.php
app/Controller/AppController.php`
Những file được thêm vào:
`app/Controller/TodoListsController.php
app/Model/TodoList.php`

Xem kỹ và xóa những phần thừa của những file đã bị thay đổi nội dung, hiển thị theo dạng Diff ( dạng show sự thay đổi bằng dấu + và - ở đầu dòng )

※ Những dòng bắt đầu bằng dấu - (màu hồng) các bạn phải xóa đi và thêm vào những dòng có dấu + (màu xanh).
※ Nếu bạn muốn copy hay paste, hãy cẩn thận đừng quên xóa hết các dấu `+` nếu không file sẽ không chạy được.



```diff:app/Config/routes.php
 /**
  * Load all plugin routes. See the CakePlugin documentation on
  * how to customize the loading of plugin routes.
  */
    CakePlugin::routes();

+ /*
+ * API
+ */
+ Router::mapResources(array (
+   'todo_lists',
+ ));
+ Router::parseExtensions('json');
+

 /**
  * Load the CakePHP default routes. Only remove this if you do not want to use
  * the built-in default routes.
  */
    require CAKE . 'Config' . DS . 'routes.php';
```



```diff:app/Controller/AppController.php

 class AppController extends Controller {
-    public $components = array('DebugKit.Toolbar');
+    public $components = array(
+        'DebugKit.Toolbar',
+        'RequestHandler'
+    );
 }
```

Các bạn tạo mới những file sau:

```diff:app/Controller/TodoListsController.php

<?php

App::uses('AppController', 'Controller');

class TodoListsController extends AppController {

    public function index() {
        $res = $this->TodoList->find('all');
        $this->set(compact('res'));
        $this->set('_serialize', 'res');
    }

    public function view($id = null) {
        $res = $this->TodoList->findById($id);
        $this->set(compact('res'));
        $this->set('_serialize', 'res');
    }

    public function add() {
        $data = $this->request->data;
        $res = $this->TodoList->save($data);
        $this->set(compact('res'));
        $this->set('_serialize', 'res');
    }
    public function delete($id) {
        $res = $this->TodoList->delete($id, false);
        $this->set(compact('res'));
        $this->set('_serialize', 'res');
    }

    public function edit($id) {
        $this->TodoList->id = $id;
        $data = $this->request->data;
        $res = $this->TodoList->save($this->request->data);
        $res = !empty($res);
        $this->set(compact('res'));
        $this->set('_serialize', 'res');
    }

}
```


```php:app/Model/TodoList.php
<?php

App::uses('AppModel', 'Model');

class TodoList extends AppModel {
}
```

###Kiểm tra kết quả bằng POSTMAN

Nhập vào ô URL:
`http://IP/rest-study/todo_lists.json`
Nhấn vào [Send].

![image](https://qiita-image-store.s3.amazonaws.com/0/94375/2368bd25-56de-6c43-55aa-cbafc037e50c.png)

Bây giờ TODO đầu tiên đã được thêm vào

![image](https://qiita-image-store.s3.amazonaws.com/0/94375/b1ed9b8f-80ab-5161-b077-448773735419.png)

※ Các chức năng thêm, xóa, và cả sửa cũng đã hoạt động và có thể với cùng URL như đã nói ở trên, để tránh nhầm lẫn chức năng, các bạn hãy sửa các thiết lập của POSTMAN.

###Kiểm tra sự thay đổi trong cơ sở dữ liệu bằng PhpMyAdmin
Truy cập đường dẫn: http://PublicIP/phpmyadmin/index.php
Nhập username là study và mật khẩu cũng là study nếu bạn cũng để như tôi.

![image](https://qiita-image-store.s3.amazonaws.com/0/94375/98ab68b8-3ff9-74a7-a494-6345317dab16.png)
Sau khi đăng nhập chúng ta có thể thấy việc ID = 1 đã xuất hiện ở table todo_list, có thể khẳng định rằng code đã hoạt động tốt.
![image](https://qiita-image-store.s3.amazonaws.com/0/94375/0024d472-f99e-2d9c-22c9-4f60260881cd.png)

###Thiết lập cho git.

Thời điểm này chúng ta đã kiểm tra kết quả và thấy mọi thứ OK, bây giờ mình sẽ cần commit lên git để cập nhật những sự thay đổi này lên repository của mình.

Đầu tiên chúng ta cần set username và địa chỉ email
※ Nếu chưa làm bước này bạn sẽ rất cáu mỗi khi gõ lệnh `git commit` đấy.
※ username, e-mail cần phải của cùng một tài khoản GitHub.

```
git config --global user.name "username-của-bạn"
git config --global user.mail "email-của-bạn"
```

※Để hiển thị setting các bạn có thể gõ lệnh `git config --global --list`
![image](https://qiita-image-store.s3.amazonaws.com/0/94375/87f75fd1-8827-1f22-6bbe-03287a06a7c2.png)

####git add, commit
Các bạn gõ như thứ tự dưới đây

```
git status
git add .
git status
git commit -m "vol/01 complete"
git status
```

※ `git status` là lệnh dùng để hiển thị những chỉnh sửa của file, nơi mình đã commit, chỉnh sửa. Nhưng vì bạn đang chạy nên không thể thấy nó được.
![image](https://qiita-image-store.s3.amazonaws.com/0/94375/e772579d-c04d-ba37-d850-556faac03a67.png)

####git push

`git push origin vol/01`
※ Nhập username và mật khẩu của Github, nếu nhận được các thông tin như trong ảnh này là đã push xong.
Nếu nhận được thông báo cần pull thì bạn thay chữ push trong câu lệnh thành pull để lấy code từ github sau khi đã comit về, sau đó gõ lại lệnh đó để push.
![image](https://qiita-image-store.s3.amazonaws.com/0/94375/fa66a64b-e6d1-38e0-126f-129198ed9172.png)
 
Như vậy source code của chúng ta đã được đưa lên GitHub thành công, các bạn có thể kiểm tra tại đầu trang và click vào repository rest-study.
![image](https://qiita-image-store.s3.amazonaws.com/0/94375/91af166f-29f4-58bf-90d2-e8e295c5308e.png)

Các bạn có thể thấy khi click vào app > Controller thì file `app/Controller/TodoListController.php`đã hiển thị.

---

![GitHub_vol01_3.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/0b52a5dc-32c9-33d9-d5ed-f88ecdc577a6.png "GitHub_vol01_3.png")

---

Khi bạn click vào tên file thì source code sẽ hiển thị
※ URL của file này theo tài khoản của tôi là https://github.com/ks-ocean/rest-study/blob/vol/01/app/Controller/TodoListsController.php.


---

![GitHub_vol01_4.png](https://qiita-image-store.s3.amazonaws.com/2006/65988/27456a05-9161-b9e3-cd64-f9620af6344a.png "GitHub_vol01_4.png")

---

##Và chúng ta đã xong bài đầu tiên trong bộ chuyên đề về RESTful web này!
Nếu các bạn gặp khó khăn nào trong quá trình cài đặt hãy để lại bình luận hoặc feedback.
Cảm ơn tất cả các bạn đã theo dõi bài viết này.