Artikel ini melanjutkan dari artikel sebelum nya dengan judul "Fungsi CRUD (Crate, Read, Update, Delete) di Lumen Micro Framework. Kita akan membuat service menggunakan PHP Lumen untuk bisa mengaplikasikan Content Negotiation. den:
1. Mampu implementasi Content Negotiation menggunakan Lumen Micro Framework
2. Membuat service yang bisa mem-validasi Accept header request. Accept header yang
diterima adalah:
- application/json
- application/xml
3. Membuat service yang bisa mem-validasi Content-Type header request. Content-Type
header yang diterima adalah:
- application/json
Setelah Anda memahami terkait Content
Negotiation, Accept header dan Content-Type header pada RESTful API Lumen.
Selanjutnya Anda akan mencoba praktikum.
Dibawah ini adalah Endpoint yang akan diimplementasikan pada
praktikum bab ini:
Method (HTTP Verbs) |
Endpoint |
Header Content Negotiation |
GET |
/posts |
Accept |
GET |
/posts/{postId} |
Accept |
DELETE |
/posts/{postId} |
Accept |
POST |
/posts |
Accept, Content-Type |
PUT |
/posts/{postId} |
Accept, Content-Type |
Pada
sub bab ini Anda akan membuat tiga fungsi yaitu read all, read detail dan
delete menggunakan HTTP Header Accept. Ikuti langkah-langkah berikut dengan
teliti agar tidak terjadi human error.
Fungsi read all ini akan melakukan satu validasi yaitu, melakukan validasi Accept Header dengan menerima application/json atau application/xml. Accept Header ini akan menentukan response format yang di kembalikan. Berikut adalah langkah-langkah yang harus diikuti.
1. Buka file app/Http/Controllers/PostsController.php
dan update function index menjadi seperti script dibawah ini.
1.
public function index (Request $request)
2.
{
3.
$acceptHeader = $request->header('Accept');
4.
5.
// validasi hanya application/json atau application/xml yang valid
6.
if ($acceptHeader === 'application/json' || $acceptHeader === 'application/xml')
7.
{
8.
$posts = Post::OrderBy("id", "DESC")->paginate(10);
9.
10. $outPut = [
11. "message" => "post",
12. "results" => $posts
13. ];
14.
15. return response ()->json($posts, 200);
16. } else {
17. return response ('not acceptable !!', 406);
18. }
19. }
2. Buka aplikasi Postman untuk melakukan pengetesan,
gunakan method GET dengan url http://localhost:8000/posts. Dibawah ini adalah
tampilan Postman ketika melakukan request tanpa mengirimkan Accept Request
Header. Responnya adalah ‘Not Acceptable!!’. Ini terjadi karena kita belum
mengirimkan Accept Header.
3. Sekarang kita tambahkan Request Header. Click
tab Headers (disamping tab Body yang lagi aktif). Tambahkan Accept Header
dengan value application/json. Ketika kita click Send, maka tampilannya akan
seperti dibawah ini.
4. Sekarang kita coba ubah value Accept Header
menjadi application/xml, maka responnya akan tetap sama yaitu dalam bentuk
JSON. Ini terjadi karena kita belum mengatur response berdasarkan Accept
Header.
Di bagian ini Anda akan melakukan setting response format berdasarkan pada Accept Header. Untuk melakukanya,silahkan Anda ikuti langkah-langkah dibawah ini:
1. Untuk implementasinya kita akan menggunakan
library PHP yaitu SimpleXMLElement.
2. Buka file app/Http/Controllers/PostsController.php
dan update function store menjadi seperti script dibawah (Lihat line 34-61).
3.
public function index (Request $request)
4.
{
5.
$acceptHeader = $request->header('Accept');
6.
7.
// // validasi hanya application/json atau application/xml yang valid
8.
if ($acceptHeader === 'application/json' || $acceptHeader === 'application/xml')
9.
{
10. $posts = Post::OrderBy("id","DESC")->paginate(10);
11.
12. if ($acceptHeader == 'application/json'){
13. // response json
14. return response ()->json($posts->items('data'), 200);
15. }else {
16.
17. $xml = new \SimpleXMLElement('<posts/>');
18. foreach ($posts->items('data') as $item){
19.
20. $xmlItem = $xml->addChild('post');
21.
22. // mengunah setiap betuk field posst menjadi xml
23. $xmlItem->addChild('id', $item->id);
24. $xmlItem->addChild('title', $item->title);
25. $xmlItem->addChild('category', $item->category);
26. $xmlItem->addChild('description', $item->description);
27. $xmlItem->addChild('status', $item->status);
28. $xmlItem->addChild('user_id', $item->user_id);
29. $xmlItem->addChild('created_at', $item->created_at);
30. $xmlItem->addChild('updated_at', $item->updated_at);
31. }
32. return $xml->asXML();
33. }
34. }else {
35. return response ('not acceptable', 406);
36. }
37. }
3. Buka aplikasi postman, kalau Accept Header nya
dalah application/json, maka tampilannya seperti ini:
4. Buka aplikasi postman, kalau Accept Header nya
dalah application/xml, maka tampilannya seperti ini:
Berikut
adalah script dari fungsi show yang telah di edit agar dapat melakukan Content
Negotiation dengan HTTP Header Accept application/json atau application/xml.
1.
public function show(Request $request, $id)
2.
{
3.
$acceptHeader = $request->header('Accept');
4.
5.
// // validasi hanya application/json atau application/xml yang valid
6.
if ($acceptHeader === 'application/json' || $acceptHeader === 'application/xml'){
7.
$post = Post::find($id);
8.
9.
if(!$post) {
10. abort(404);
11. }
12.
13. if ($acceptHeader === 'application/json'){
14. // response json
15. return response ()->json($post, 200);
16.
17. }else {
18.
19. $xml = new \SimpleXMLElement('<posts/>');
20.
21. $xmlItem = $xml->addChild('post');
22.
23. // mengunah setiap betuk field posst menjadi xml
24. $xmlItem->addChild('id', $post->id);
25. $xmlItem->addChild('title', $post->title);
26. $xmlItem->addChild('category', $post->category);
27. $xmlItem->addChild('description', $post->description);
28. $xmlItem->addChild('status', $post->status);
29. $xmlItem->addChild('user_id', $post->user_id);
30. $xmlItem->addChild('created_at', $post->created_at);
31. $xmlItem->addChild('updated_at', $post->updated_at);
32.
33. return $xml->asXML();
34. }
35.
36. }else {
37. return response ('not acceptable', 406);
38. }
39. }
Berikut adalah tes tanpa menggunakan parameter Accepr
Header.
Berikut adalah tes menggunakan parameter application/json.
Berikut adalah tes menggunakan parameter application/xml.
Berikut
adalah script dari fungsi destroy yang telah di edit agar dapat melakukan
Content Negotiation dengan HTTP Header Accept application/json atau
application/xml.
1.
public function destroy(Request $request, $id)
2.
{
3.
$acceptHeader = $request->header('Accept');
4.
// validasi hanya application/json atau application/xml yang valid
5.
if ($acceptHeader === 'application/json' || $acceptHeader === 'application/xml'){
6.
$post = Post::find($id);
7.
8.
if(!$post) {
9.
abort(404);
10. }
11.
12. $post->delete();
13.
14. if ($acceptHeader === 'application/json'){
15. $message = ['message' => 'deleted successfully', 'post_id' => $id];
16. // response json
17. return response ()->json($message, 200);
18.
19. }else {
20.
21. $xml = new \SimpleXMLElement('<posts/>');
22.
23. $xmlItem = $xml->addChild('post');
24.
25. // mengunah setiap betuk field posst menjadi xml
26. $xmlItem->addChild('id', $post->id);
27. $xmlItem->addChild('message','deleted successfully');
28.
29. return $xml->asXML();
30. }
31.
32. }else {
33. return response ('not acceptable', 406);
34. }
35. }
Berikut adalah tes tanpa menggunakan parameter Accepr
Header.
Berikut adalah tes menggunakan parameter application/xml.
Pada
sub bab ini Anda akan membuat dua fungsi create dan update menggunakan HTTP Header
Content-Type. Ikuti langkah-langkah dengan teliti agar tidak terjadi human
error.
Untuk
membuat fungsi create dan update yang dapat melakukan dua validasi, yaitu :
1.
Validasi Accept Header: menerima
application/json atau application/xml
2.
Validasi Content-Type Header: hanya menerima
application/json
Berikut adalah langkah-langkah yang harus diikuti.
1. Buka file
app/Http/Controllers/PostsController.php dan update function store menjadi seperti
script dibawah ini .
2.
public function store (Request $request)
3.
{
4.
// validasi hanya application/json atau application/xml yang valid
5.
if ($acceptHeader === 'application/json' || $acceptHeader === 'application/xml'){
6.
$contentTypeHeader = $request->header('Content-Type');
7.
8.
// validasi: hanya application json yang valid
9.
if ($contentTypeHeader === 'application/json'){
10. $input = $request->all();
11. $post = Post::create($input);
12.
13. return response()->json($post, 200);
14. }else{
15. return response ('unsupported median type', 415);
16. }
17. }else {
18. return response ('not acceptable', 406);
19. }
20.
21. }
2. Buka aplikasi Postman untuk melakukan pengetesan,
gunakan metdhod POST dengan endpoint http://localhost:8000/posts. Dibawah ini
adalah tampilan Postman ketika melakukan request tanpa mengirimkan Accept
Request Header. Responnya adalah ‘Not Acceptable!’. Ini terjadi karena kita
belum mengirimkan Accept Header.
3. Sekarang kita tambahkan Request Header. Click
tab Headers (disamping tab Body yang lagi aktif). Tambahkan Accept Header
dengan value application/json. Ketika kita click Send, maka tampilannya akan seperti
dibawah ini, response ny adalah ‘Unsupported Media Type’. Ini terjadi karena
kita belum mengirimkan Content-Type Header.
4. Sekarang kita tambahkan Content-Type Header.
Tambahkan Content-Type Header dengan value application/json. Lihat gambar dibawah
ini:
5. Kemudian kita akan mengatur parameter Post dalam bentuk JSON. Klik tab Body -> Pilih Raw -> Pada tanda panah ke bawah di paling kiri pilih JSON(application/json).
Kemudian isi paramter JSON nya. Lihat Gambar.
Klik tombol Send, maka
tampilan dari responya adalah JSON.
5.3.2.1
Fungsi Update
Berikut
adalah script dari fungsi update yang telah di edit agar dapat melakukan
Content Negotiation dengan HTTP Header Content-Type.
0 komentar:
Posting Komentar