Implementasi Content Negotiation pada Lumen Micro Framework #07.1


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     

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.




Set Response Format HTTP Accept Header ke XML

            

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:





Fungsi Read Detail

            

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.




Fungsi Delete

            

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.


Fungsi Create

            

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