pemrograman restful api - komputasi.files.wordpress.com · •resources dikenali dengan global id...
TRANSCRIPT
![Page 1: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/1.jpg)
Pemrograman RESTful [email protected]
![Page 2: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/2.jpg)
Apa itu?
![Page 3: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/3.jpg)
Apa itu REST?
REST bermakna:
• REpresentational
• State
• Transfer
![Page 4: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/4.jpg)
REpresentational ? State ? Transfer ?
• Merepresentasikan status dari database pada suatu waktu. Caranya?
• REST merupakan suatu architectural style yang didasarkan pada web-standard dan protokol HTTP.
• Dalam arsitektur berbasis REST semua dianggap Resource.
• Resource diakses via suatu interface umum berbasiskan pada metode standard HTTP.
• Biasanya kita mempunyai REST server yang menyediakan akses ke resources dan REST client yang mengakses dan memodifikasi REST resources tersebut.
![Page 5: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/5.jpg)
REpresentational ? State ? Transfer ?
• Setiap resource harus mendukung operasi umum HTTP.
• Resources dikenali dengan global ID (biasanya berupa URI atau URL).
• REST memungkinkan resources tersebut mempunyai representasi berbeda, seperti text, XML dan JSON.
• Sifatnya Stateless. Sangat cocok untuk sistem terdistribusi.
• Komponen Stateless dapat secara bebas di-redeploy jika terjadi kegagalan, dan dapat di-scale untuk mengakomodir perubahan beban.
• Ini karena suatu request dapat diarahkan ke instance tertentu dari komponen.
![Page 6: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/6.jpg)
Metode HTTP
• Metode PUT, GET, POST dan DELETE biasa digunakan dalam arsitektur berbasis REST
Metode HTTP
Operasi CRUD
Keterangan
POST INSERT Menambahkan ke sumber daya yang ada
PUT UPDATE Memperbarui sumber daya yang ada
GET SELECT Mengambil suatu sumber daya. Sumber daya itu tidak pernah berubah via request GET
DELETE DELETE Menghapus suatu sumber daya
![Page 7: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/7.jpg)
Arsitektur
![Page 8: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/8.jpg)
Contoh HTTP Request
Suatu baris kosong memisahkan header & body
Body (badan) request message
Header dari request message
Baris request
Header request
![Page 9: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/9.jpg)
Contoh HTTP Response
Suatu baris kosong memisahkan header & body
Body (badan) response message
Header dari response message
Baris status
Header respon
![Page 10: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/10.jpg)
HTTP REST Request:
GET https://www.myhost.com/api/v1/user/1/cities
Baca, Semua kota untuk user dengan id bernilai 1
GET /user/1/cities http/1.1host: https://www.myhost.com/api/v1Content-Type: application/jsonAccept-Language: us-enstate_id: 2
HTTP REST API Request
![Page 11: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/11.jpg)
HTTP REST Response:
HTTP/1.1 200 OK (285ms)Date: Fri, 21 Apr 2017 10:27:20 GMTServer: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/7.0.16X-Powered-By: PHP/7.0.16Content-Length: 109Keep-Alive: timeout=5, max=100Connection: Keep-AliveContent-Type: application/json; charset=UTF-8
{"status":"success","message":"CityList","data":[{"city_name":"Visakhapatnam"},{"city_name":"Vijayawada"}]}
HTTP REST API Response
![Page 12: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/12.jpg)
Kode Status Respon HTTP
• 1xx Kode mengenai informasi
• 2xx Kode jika sukses
• 3xx Kode redirection
• 4xx Kode error Client
• 5xx Kode error Server
• Lihat di https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
![Page 13: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/13.jpg)
Poin-poin PentingBagi REST API
![Page 14: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/14.jpg)
Gunakan Kata Benda, Bukan Kata Kerja di URL
Maksud Metode Salah Benar
Memperoleh daftar user GET /getAllCars /users
Membuat pengguna baru POST /createUser /users
Menghapus user DELETE /deleteUser /users/10
Mendapatkan saldo user GET /getUserBalance /users/11/balance
![Page 15: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/15.jpg)
Gunakan Kata Benda Jamak
• Jangan dicampur kata benda tunggal dan jamak. Pastikan tetap simpel dan hanya gunakan bentuk jamak untuk semua sumber daya.• /cars bukan /car
• /users bukan /user
• /products bukan /product
• /settings bukan /setting
![Page 16: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/16.jpg)
Metode GET Harus Tidak Mengubah Status
• Gunakan metode PUT, POST dan DELETE bukan GET untuk mengubah status.
• Jangan gunakan metode GET atau parameter Query untuk mengubah satus:• GET /users/711?aktifkan atau
• GET /users/711/aktifkan
![Page 17: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/17.jpg)
Gunakan Sub-resources untuk Relasi:
• Jika suatu sumber daya berhubungan dengan sumber daya lain, gunakan sub-sumber daya• GET /cars/711/drivers/ (mengembalikan daftar drivers untuk car 711)
• GET /cars/711/drivers/4 (mengembalikan driver #4 untuk car 711)
• Disebut juga Resources Chaining
• Resources dalam URL RESTful dapat disambung untuk membentuk suatu hirarki relasi.• resource1/{id}/resource2/{id}
• Selalu gunakan koleksi diikuti satu anggotanya• …/customers/123/orders/456/items/789
Items dimiliki orders, orders dimiliki oleh customers.
![Page 18: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/18.jpg)
Resources Chaining
• URL harus dapat telusur (Hackable) ‘sampai pohonnya’• User harus mampu menghapus leaf path-nya dan memperoleh respon balik
yang diharapkan.
…/customers/123/orders
Menghapus ujung URL sampai dengan orders harus mengembalikan semua orders untuk customer tersebut.
• Jangan gunakan anggota yang dimiliki koleksi tanpa mendapatkan koleksi tersebut dalam path terlebih dahulu.• Bagus: /customers/123/orders/456/items/789
• Jelek: /customers/123/orders/456/789
![Page 19: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/19.jpg)
Gunakan Header HTTP untuk Format Serialisasi
• Client dan server perlu mengetahui format yang digunakan selama komunikasi.
• Format tersebut harus dispesifikasikan dalam HTTP-Header.• Content-Type mendefinisikan format request.
• Accept mendefinisikan daftar format dari respon yang acceptable.
![Page 20: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/20.jpg)
Versioning Itu Penting
• Membuat versi API adalah wajib
• Jangan rilis API tanpa versi (hanya boleh saat latihan).
• Gunakan bilangan bulat sederhana dan hindari notasi titik seperti 2.5
• URL digunakan untuk merepresentasikan API versioning, dimulai dengan huruf “v”• /blog/api/v1
![Page 21: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/21.jpg)
Tangani Error dengan Kode Status HTTP
Kode Keterangan Kode Keterangan
200 OK (Everything is working) 403 Forbidden (The server understood therequest, but is refusing it or the access isnot allowed)
201 OK (New resource has been created) 404 Not found (There is no resource behind theURI)
204 OK (Resource successfully deleted) 405 Method not allowed
400 Bad Request (The request was invalid or cannot be served. The exact error should be explained in the error payload. E.g. “The JSON is not valid“)
408 Request timeout
401 Unauthorized (The request requires anuser authentication)
500 Internal server error
![Page 22: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/22.jpg)
Filtering:
• Gunakan suatu parameter query unik untuk semua field atau bahasa query untuk penyaringan• GET /cars?color=red (Mengembalikan daftar mobil merah)
• GET /users?name=tom (Mengembalikan daftar pengguna yang namanya cocok dengan tom)
![Page 23: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/23.jpg)
Pengurutan
• Mungkinkan pengurutan ascending dan descending terhadap banyak field
GET /cars?sort=-manufacturer,+model
Untuk mengembalikan sedaftar cars terurut secara descendingberdasarkan manufacturers dan ascending berdasarkan models)
![Page 24: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/24.jpg)
Paging:
• Gunakan limit dan offset.
• Fleksibel bagi pengguna dan umum dalam penanganan hasil query database.
• Sebaiknya, ditetapkan default limit=20 dan offset=0• GET /cars?offset=10&limit=5
![Page 25: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/25.jpg)
Alias untuk Query Umum
• Agar pemanfaatan API lebih nyaman bagi rerata consumer,pertimbangkan untuk memaket himpunan kondisi ke dalam pathRESTful yang mudah diakses.
• Sebagai contoh, kasus di bawah ini dapat ditiru:• POST /users (User Register: Membuat user baru)
• POST /users/login (User Login: membuatkan auth token untuk otentikasi user)
![Page 26: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/26.jpg)
Pengembangan REST API Secara Mudah?
• Checkout Slim - Suatu microframework untuk PHP.• Dokumentasi: https://www.slimframework.com/docs/
![Page 27: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/27.jpg)
Contoh Slim: Hello World
<?php
require 'vendor/autoload.php';
$app = new \Slim\App();
$app->get('/ping', function ($request, $response) {
$body = json_encode(['ack' => time()]);
$response->write($body);
$response = $response->withHeader(
'Content-Type', 'application/json');
return $response;
});
$app->run();
![Page 28: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/28.jpg)
PSR-7?
![Page 29: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/29.jpg)
Tentang HTTP
• Request:{METHOD} {URI} HTTP/1.1
Header: value1,value2
Another-Header: value
Message body
• Response:HTTP/1.1 {STATUS_CODE} {REASON_PHRASE}
Header: value
Message body
![Page 30: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/30.jpg)
PHP Saat Ini
• Request:• $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES
• apache_request_headers()
• php://input
• Response:• header()
• echo (& ob_*() family)
![Page 31: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/31.jpg)
PSR 7: HTTP Messaging
• Hanya beberapa interface:• RequestInterface (& ServerRequestInterface)
• ResponseInterface
• UriInterface
• UploadedFileInterface
![Page 32: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/32.jpg)
Fitur Kunci 1: Immutability
Request, Response, Uri & UploadFile bersifat immutable
$uri = new Uri('https://api.joind.in/v2.1/events');
$uri2 = $uri->withQuery('?filter=upcoming’);
$request = (new Request())
->withMethod('GET')
->withUri($uri2)
->withHeader('Accept', 'application/json')
->withHeader('Authorization', 'Bearer 0873418d');
![Page 33: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/33.jpg)
Fitur Kunci 2: Streams
Message bodies adalah streams
$body = new Stream();
$body->write('<p>Hello');
$body->write('World</p>’);
$response = (new Response())
->withStatus(200, 'OK')
->withHeader('Content-Type', 'application/header')
->withBody($body);
![Page 34: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/34.jpg)
Negosiasi Metode HTTP
![Page 35: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/35.jpg)
Negosiasi Metode HTTP
$ http --json PUT http://localhost:8888/ping
HTTP/1.1 405 Method Not Allowed
Allow: GET
Connection: close
Content-Length: 53
Content-type: application/json
Host: localhost:8888
X-Powered-By: PHP/5.6.14
{
"message": "Method not allowed. Must be one of: GET"
}
![Page 36: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/36.jpg)
Routing Metode HTTP
$app->get('/author', function($req, $res) {});
$app->post('/author', function($req, $res) {});
$app->get('/author/{id}', function($req, $res) {});
$app->put('/author/{id}', function($req, $res) {});
$app->patch('/author/{id}', function($req, $res) {});
$app->delete('/author/{id}', function($req, $res) {});
$app->any('/author', function($req, $res) {});
$app->map(['GET', 'POST'], '/author', /* … */);
![Page 37: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/37.jpg)
Rute Dinamis
$app->get('/author/{id}’, function($request, $response, $args) {
$id = $args['id'];
$author = $this->authors->loadById($id);
$body = json_encode(['author' => $author]);
$response->getBody()->write($body);
$response = $response->withHeader(
'Content-Type', 'application/json');
return $response;
});
![Page 38: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/38.jpg)
Regex
// hanya bilangan
$app->get('/author/{id:\d+}', $callable);
// segmen opsional
$app->get('/author[/{id:\d+}]', $callable);
$app->get('/news[/{y:\d{4}}[/{m:\d{2}}]]', $callable);
![Page 39: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/39.jpg)
Penanganan Content-type
![Page 40: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/40.jpg)
Penanganan Content-type
Header Content-type menentukan format dari data masuk (incoming)
$ curl -X "POST" "http://localhost:8888/author" \
-H "Content-Type: application/json" \
-d '{ "name":"Terry Pratchett" }'
![Page 41: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/41.jpg)
Read dengan getBody()
$app->post('/author',
function ($request, $response, $args) {
$data = (string)$request->getBody();
return $response->write(print_r($data, true));
}
);
Output:
{ "name":"Terry Pratchett" }
![Page 42: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/42.jpg)
Read dengan getParsedBody()
$app->post('/author’, function ($request, $response, $args) {
$data = (array)$request->getParsedBody();
return $response->write(print_r($data, true));
});
Output:
Array
(
[name] => Terry Pratchett
)
![Page 43: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/43.jpg)
Bekerja juga dengan XML
curl -X "POST" "http://localhost:8888/author" \
-H "Content-Type: application/xml" \
-d "<author><name>Terry Pratchett</name></author>“
Output:
Array
(
[name] => Terry Pratchett
)
![Page 44: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/44.jpg)
Dan Data Form
curl -X "POST" "http://localhost:8888/author" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "name=Terry Pratchett"
Output:
Array
(
[name] => Terry Pratchett
)
![Page 45: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/45.jpg)
Format Lagi? Misal CSV
name,dob
Terry Pratchett,1948-04-28
Andy Weir,1972-06-17
dengan curl:
curl -X "POST" "http://localhost:8888/author" \
-H "Content-Type: text/csv" \
-d $'name,dob
Terry Pratchett,1948-04-28
Andy Weir,1972-06-17'
![Page 46: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/46.jpg)
Mendaftarkan Tipe Media
$request->registerMediaTypeParser('text/csv',function ($input) {$data = str_getcsv($input, "\n");$keys = str_getcsv(array_shift($data));
foreach ($data as &$row) {$row = str_getcsv($row);$row = array_combine($keys, $row);
}
return $data;
}
);
![Page 47: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/47.jpg)
Hasil
Array
(
[0] => Array
(
[name] => Terry Pratchett
[dob] => 1948-04-28
)
[1] => Array
(
[name] => Andy Weir
[dob] => 1972-06-17
)
)
![Page 48: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/48.jpg)
Middleware
Middleware is code that exists between the request and response, and which can take the incoming request, perform actions based on it, and
either complete the response or pass delegation on to the next middleware in the queue.
Matthew Weier O'Phinney
![Page 49: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/49.jpg)
Middleware
• Manipulasi dari
Respon ke Browser
![Page 50: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/50.jpg)
Middleware
function ($request, $response, callable $next = null) {
// do something before
// call through to next middleware
if ($next) {
$response = $next($request, $response);
}
// do something with $response after
return $response;
}
![Page 51: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/51.jpg)
Tipe Media Middleware
$app->add(function ($request, $response, $next) {
$request->registerMediaTypeParser('text/csv',function ($input) {
$data = explode("\n", $input);
$keys = str_getcsv(array_shift($data));
foreach ($data as &$row) {
$row = str_getcsv($row);
$row = array_combine($keys, $row);
}
return $data;
});
return $next($request, $response);
});
![Page 52: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/52.jpg)
Menghargai Accept header
![Page 53: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/53.jpg)
Menghormati Accept Header
Mengembalikan data dalam format yang diharapkan oleh client
curl -X "POST" "http://localhost:8888/author" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "name":"Terry Pratchett" }'
![Page 54: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/54.jpg)
Mengembalikan JSON
$app->post('/author’, function ($request, $response, $args) {
$author = new Author($request->getParsedBody());
$this->authors->save($author);
$response = $response->withJson($author->asArray());
$response = $response->withStatus(201);
return $response;
});
![Page 55: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/55.jpg)
Mengembalikan JSON
HTTP/1.1 201 Created
Content-type: application/json
Content-Length: 106
{
"id":"2ff815ad-491d-4db8-a025-363516e7c27e",
"name":"Terry Pratchett",
"biography":null
}
![Page 56: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/56.jpg)
Mengembalikan XML
curl -X "POST" "http://localhost:8888/author" \
-H "Accept: application/xml" \
-H "Content-Type: application/json" \
-d '{ "name":"Terry Pratchett" }'
![Page 57: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/57.jpg)
Menentukan Tipe Media
$ composer require willdurand/negotiation
// find preferred format from Accept header
function determineMediaType($acceptHeader) {$negotiator = new \Negotiation\Negotiator();$known = ['application/json', 'application/xml'];$mediaType = $negotiator->getBest($acceptHeader, $known);
if ($mediaType) {return $mediaType->getValue();
}
return 'application/json';
}
![Page 58: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/58.jpg)
Menformat Output
$acceptHeader = $request->getHeaderLine('Accept')
$mediaType = determineMediaType($acceptHeader);
switch ($mediaType) {
case 'application/xml':
$response->getBody()->write(arrayToXml($data));
break;
case 'application/json':
$response->getBody()->write(json_encode($data));
break;
}
return $response->withHeader("Content-Type", $mediaType);
![Page 59: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/59.jpg)
Output XML
HTTP/1.1 201 Created
Content-type: application/xml
Content-Length: 131
<?xml version="1.0"?>
<root>
<id>98c22fa3-bf97-48c8-accd-025470c34b46</id>
<name>Terry Pratchett</name>
<biography/>
</root>
![Page 60: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/60.jpg)
Ada Komponen Untuk Ini
$ composer require akrabat/rka-content-type-renderer
Penggunaannya:
$renderer = new RKA\ContentTypeRenderer\Renderer();
$response = $renderer->render($request, $response, $data);
return $response->withStatus(201);
![Page 61: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/61.jpg)
Penanganan Error
![Page 62: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/62.jpg)
Penanganan Error
• Method not allowed
• Not found
• Generic error
![Page 63: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/63.jpg)
Method not allowed
curl -X "PUT" "http://localhost:8888/ping"
HTTP/1.1 405 Method Not Allowed
Content-type: text/html;charset=UTF-8
Allow: GET
<html>
<body>
<h1>Method not allowed</h1>
<p>Method not allowed. Must be one of:
<strong>GET</strong></p>
</body>
</html>
![Page 64: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/64.jpg)
Not found
curl -X "GET" "http://localhost:8888/foo" \
-H "Accept: application/xml"
HTTP/1.1 404 Not Found
Content-Type: application/xml
Allow: GET
<root><message>Not found</message></root>
![Page 65: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/65.jpg)
Error Tambahan (Personal)
$app->get('/author/{id}’,
function ($request, $response, $args) {
$author = $this->authors->loadById($args['id’]);
if (!$author) {
return $this->notFoundHandler($request, $response);
}
// continue with $author
}
);
![Page 66: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/66.jpg)
Generic error
$app->get('/error',
function ($request, $response, $args) {
throw new \Exception("Something has gone wrong!");
});
curl -X "GET" "http://localhost:8888/error" -H "Accept: application/json"
HTTP/1.1 500 Internal Server Error
Content-type: application/json
Content-Length: 43
{
"message": "Slim Application Error"
}
![Page 67: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/67.jpg)
Informasi Eksepsi (Exception)
$settings = [
'settings' => [
'displayErrorDetails' => true,
]
];
$app = new Slim\App($settings);
![Page 68: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/68.jpg)
Informasi Eksepsi
HTTP/1.1 500 Internal Server ErrorContent-type: application/json {
"message": "Slim Application Error","exception": [
{"type": "Exception","code": 0,"message": "Something has gone wrong!","file": "/dev/an-api/app/routes.php","line": 8,"trace": [
"#0 [internal function]: Closure->{closure} …"#2 /dev/an-api/vendor/slim/slim/Slim/Route.php(……
![Page 69: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/69.jpg)
Menangani Warnings
$app->get('/error',
function ($request, $response, $args) {
ini_get(); // will generate a warning
});
// convert errors into exceptions
set_error_handler(function ($level, $msg, $file, $ln) {
if (!(error_reporting() & $level)) { return; }
throw new \Exception($msg, $level);
});
![Page 70: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/70.jpg)
Versi
![Page 71: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/71.jpg)
Versi
Dua pilihan:
• Segment di dalam URL:
http://api.example.com/v1/author
• Tipe Media:
Accept: application/vnd.rka.author.v1+json
![Page 72: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/72.jpg)
URL Segment
Use route groups:
$app->group('/v1', function () {
// http://api.example.com/v1/author
$this->get('/author',
function ($request, $response) { /*…*/ }
);
// http://api.example.com/v1/author/123
$this->get('/author/{id}',
function ($request, $response, $args) { /*…*/ }
);
});
![Page 73: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/73.jpg)
Media Type Versioning
• Pertama, mari kita lihat dukungan dependency injection dari Slim
![Page 74: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/74.jpg)
Container
Daftarkan layanan dengan DIC
$settings = ['settings' => ['dsn' => 'sqlite:data/bookshelf.db',]];
$app = new Slim\App($settings);
$container = app->getContainer();
$container['pdo'] = function ($c) {
return new PDO($c['settings']['dsn']);
};
$container['authors'] = function ($c) {
return new Bibliotheque\AuthorMapper($c['pdo']);
};
![Page 75: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/75.jpg)
Kelas Controller
Daftarkan controller dengan container
$container['AuthorController'] = function ($c) {
$renderer = $c->get('renderer');
$authors = $c->get('authors');
return new App\AuthorController($renderer, $authors);
}
// Register with router:
$app->get('/author', 'AuthorController:listAll');
![Page 76: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/76.jpg)
Controller Author
class AuthorController {
public function __construct($renderer, $authors) {
$this->renderer = $renderer;
$this->authors = $authors;
}
public function listAll($req, $res) {
$authors = $this->authors->fetchAll();
$data = ['authors' => $authors];
return $this->renderer->render($req, $res, $data);
}
}
![Page 77: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/77.jpg)
Media Type Versioning
Pilih controller berdasarkan pada Accept header:
$container['AuthorController'] = function ($c) {
$request = $c->get('request');
$acceptHeader = $request->getHeaderLine('Accept');
if (strpos($acceptHeader,
'application/vnd.rka.author.v2') !== false) {
return new App\V2\AuthorController(/*…*/);
}
return new App\V1\AuthorController(/*…*/);
};
![Page 78: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/78.jpg)
Filtering & Validasi
![Page 79: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/79.jpg)
Filtering & Validasi
Route middleware memastikan callable clean!
$app->post(
'/author',
'AuthorController:addNewAuthor'
)->add('AuthorValidator');
![Page 80: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/80.jpg)
AuthorValidator
class AuthorValidator {
public function __invoke($req, $res, $next) {
$data = $req->getParsedBody();
$validator = new \Valitron\Validator($data);
$validator->rule('required', 'name');
if (!$validator->validate()) {
$e = ['errors' => $validator->errors()];
$response = $this->renderer->render($req, $res, $e);
return $response->withStatus(422);
}
return $next($req, $res);
}
}
![Page 81: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/81.jpg)
Validasi
curl -X "POST" "http://localhost:8888/author" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":""}'
HTTP/1.1 422 Unprocessable Entity
Content-type: application/json
Content-Length: 84
{
"errors": {
"name": [
"Name is required"
]
}
}
![Page 82: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/82.jpg)
Rangkuman
API yang bagus berurusan dengan:• Negosiasi metode HTTP
• Penanganan Content-type
• Menghormati Accept header
• Error handling
• Versions
• Filtering & Validasi
![Page 83: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/83.jpg)
Sumder Daya
• http://phptherightway.com
• http://slimframework.com/docs
• https://github.com/slimphp/Slim
• http://akrabat.com/category/slim-framework/
• http://ryanszrama.com/topics/slim
![Page 84: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/84.jpg)
Praktek
• RESTful API dengan PHP
• RESTful API dengan Slim Framework
![Page 85: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/85.jpg)
Perangkat & Tutorial
http://10.5.10.160/sister/
![Page 86: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/86.jpg)
Membangun RESTful Web Service dengan PHP (Native)
![Page 87: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/87.jpg)
Langkah-Langkah: Persiapan
• Pastikan PHP dan Database Server (MySQL misalny) jika diperlukan. Jika perlu Web Server (misal Apache), silakan diinstall. Lebih mudah menggunakan paket seperti XAMPP
• Buat folder proyek. Di sini semua file web service RESTful diletakkan, misal: “c:\xampp\htdocs\produk”
• Tetapkan semua rute (URL) untuk web service, mulai untuk metode GET, POST, PUT dan DELETE
GET /api/products Meretrieve semua produkGET /api/products/:id Meretrieve satu produk yang kunci :id POST /api/products Menambahkan suatu produk baru PUT /api/products/:id Mengupdate satu produk yang kunci :idDELETE /api/products/:id Menghapus satu produk yang kunci :id
![Page 88: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/88.jpg)
Langkah-langkah: Persiapan
• Jalankan Apache Web Server dan MySQL Database Server (via Control Panel XAMPP)
• Membuat database bernama “rest_api”, dapat menggunakan PHPMyAdmin (localhost/phpmyadmin)
• Buat tabel bernama “products”, dengan field: • id : integer, auto_inc
• product_name : varchar (100)
• price : float
• quantity : integer
• Seller : varchar (30)
![Page 89: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/89.jpg)
Database rest_api tabel products
Masukkan data contoh, 1 s.d 5 record.
![Page 90: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/90.jpg)
Langkah-Langkah: Membuat Web Service
• Membangun koneksi ke Database Server
//koneksi ke database
$connection = mysqli_connect('localhost','root','','rest_api');
![Page 91: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/91.jpg)
Langkah-langkah: Membuat Web Service
• Mengidentifikasi request dari consumer (client): Apa metode HTTP yang digunakan?
$request_method = $_SERVER["REQUEST_METHOD"]; switch($request_method) {
case 'GET’: //jika metode HTTP GET, ngapain?
case 'POST’: // Metode POST, untuk menambahkan produk baru (Insert)
case 'PUT’: // Metode PUT, client ingin mengupdate produk tertentu
case 'DELETE’: // Metode DELETE, client iningin menghapus produk tertentu
default: // Jika bukan salah satu dari 4 metode di atas
}
![Page 92: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/92.jpg)
Langkah-langkah: Membuat Web Service
• Jika GET
// Metode GET, client hanya ingin meretrieve produk // dengan product_id tertentu? if(!empty($_GET["product_id"])) {
$product_id = intval($_GET["product_id"]); get_products($product_id);
} //jika tidak dengan product_id, berarti semua produk else {
get_products(); } break;
Fungsi get_products()?
![Page 93: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/93.jpg)
Fungsi get_products()
function get_products($product_id=0) {
global $connection;
//query mengambil semua produk
$query = "SELECT * FROM products";
//hanya mengambil satu produk sesuai product_id
if($product_id ! = 0) { $query .= " WHERE id = " . $product_id . " LIMIT 1"; }
$response = array();
$result = mysqli_query($connection, $query);
while($row = mysqli_fetch_array($result)) { $response[] = $row; }
//respon untuk client dalam format JSON
header('Content-Type: application/json');
echo json_encode($response);
}
![Page 94: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/94.jpg)
Langkah-langkah: Membuat Web Service
Jika POST, PUT dan DELETE?
//Metode POST untuk menambahkan produk baru (Insert) insert_product(); break; 6
//Metode PUT untuk mengupdate produk tertentu $product_id = intval($_GET["product_id"]); update_product($product_id); break;
//Metode DELETE untuk menghapus produk tertentu $product_id = intval($_GET["product_id"]); delete_product($product_id); break;
![Page 95: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/95.jpg)
Langkah-langkah: Membuat Web Service
• Bagaimana fungsi:
• insert_product()
• update_product()
• delete_product()
• Lihat naskah tutorial!
![Page 96: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/96.jpg)
Insert_product()
function insert_product() { global $connection; $product_name = $_POST["product_name"]; $price = $_POST["price"]; $quantity = $_POST["quantity"]; $seller = $_POST["seller"]; $query = ”INSERT INTO products SET product_name = '{$product_name}’, “ .
“price = {$price}, quantity = {$quantity}, seller = '{$seller}'”; if(mysqli_query($connection, $query)) { $response = array(
'status' => 1, 'status_message' =>'Produk berhasil ditambahkan.'); } else { $response = array(
'status' => 0, 'status_message' =>'Produk GAGAL ditambahkan.'); } header('Content-Type: application/json'); echo json_encode($response);
}
![Page 97: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/97.jpg)
update_product()
function update_product($product_id) { global $connection; parse_str(file_get_contents("php://input"), $post_vars); $product_name = $post_vars["product_name"]; $price = $post_vars["price"];$quantity = $post_vars["quantity"]; $seller = $post_vars["seller"]; $query = “UPDATE products SET product_name = '{$product_name}',”
. “ price = {$price}, quantity = {$quantity}, “
. “ seller = '{$seller}' WHERE id = ” . $product_id; if(mysqli_query($connection, $query)) { $response = array(
'status' => 1, 'status_message' =>'Produk berhasil diupdate.'); } else { $response = array(
'status' => 0, 'status_message' =>'Produk GAGAL diupdate.'); } header('Content-Type: application/json'); echo json_encode($response);
}
![Page 98: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/98.jpg)
delete_product()
function delete_product($product_id) { global $connection; $query = "DELETE FROM products WHERE id = ".$product_id;
if(mysqli_query($connection, $query)) { $response=array(
'status' => 1, 'status_message' => 'Produk berhasil dihapus.' ); } else { $response = array(
'status' => 0, 'status_message' => 'Produk GAGAL dihapus.' ); } header('Content-Type: application/json'); echo json_encode($response);
}
![Page 99: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/99.jpg)
Menjalankan Web Service: Hanya PHP
• Buka console atau Terminal
• Masuk ke folder dimana file web service berada:cd \xampp\htdocs\produk
• Jalankan server web development dari PHP:php -S localhost:8000 products.php
PHP 7.2.2 Development Server started at Tue Apr 17 09:56:03 2018
Listening on http://localhost:8000
Document root is C:\xampp\htdocs\produk
Press Ctrl-C to quit.
![Page 100: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/100.jpg)
.htaccess: Menulis Ulang URL
• Akses via Web browser:• GET semua produk: http://localhost:8000/products
• GET produk tertentu: http://localhost:8000/products?product_id=1
• Bagaimana agar menjadi? http://localhost:8000/products/1
• Buat file .htaccess seperti berikut:RewriteEngine On # Turn on the rewriting engine
RewriteRule ^products/?$ products.php [NC,L]
RewriteRule ^products/([0-9]+)/?$ products.php?product_id=$1 [NC,L]
![Page 101: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/101.jpg)
Bagaimana Server Web Apache?
• Apache mempunyai fitur lebih banyak: Virtual Host berbasis Nama
• Jalankan Apache via XAMPP Control Panel
• File-file konfigurasi Virtual host• C:/xampp/apache/conf/extra/httpd-vhosts.conf
• C:\Windows\System32\drivers\etc\hosts127.0.0.1 sister
• Akses via Web browser:• GET semua produk: http://sister/products• GET produk tertentu: http:// sister/products?product_id=1
<VirtualHost *:80>
DocumentRoot "c:/xampp/htdocs/produk"
ServerName sister
</VirtualHost>
![Page 102: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/102.jpg)
C:/xampp/apache/conf/extra/httpd-vhosts.conf
• VirtualHost: Banyak web server menggunakan port 80 sebagai port defaultnya. Namun kita dapat mengubahnya ke port 8080, 8081 dll.
• DocumentRoot: Folder dimana file-file situs akan diletakkan. Misalnya “produk”.
• ServerName: URL bagi virtual host.
• Directory: directory dari virtual host.
<VirtualHost *:80>DocumentRoot "c:/xampp/htdocs/produk"ServerName sister
</VirtualHost>
![Page 103: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/103.jpg)
Menguji RESTful API
• Metode GET: cukup via web browser standard
• Metode POST, PUT dan DELETE: harus via web software yang mendukung metode HTTP• Salah satu: Google Postman
• Membuat client sendiri: • HTTP/2 Client di Java
• PHP menggunakan cURL
![Page 104: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/104.jpg)
Postman Demo: GET
![Page 105: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/105.jpg)
Postman Demo: POST
![Page 106: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/106.jpg)
Postman Demo: PUT
![Page 107: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/107.jpg)
Postman Demo: DELETE
![Page 108: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/108.jpg)
Membuat Client dengan PHP (cURL)
• Membangun koneksi ke provider : curl_init()
• Menambahkan data request : curl_setopt()
• Mengirimkan request : curl_exec()
• Menutup koneksi : curl_close()
![Page 109: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/109.jpg)
PHP cURL: Meminta Semua Produk
$url = 'http://localhost:8000products'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response_json = curl_exec($ch); curl_close($ch); $response = json_decode($response_json, true);
![Page 110: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/110.jpg)
PHP cURL: Meminta Produk Tertentu
$url = 'http://sister/products/5';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPGET, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_json = curl_exec($ch);
curl_close($ch);
$response = json_decode($response_json, true);
![Page 111: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/111.jpg)
PHP cURL: Menambahkan Produk Baru
$data = array( 'product_name' => 'Television’,
'price' => 1000, 'quantity' => 10,
'seller' => 'XYZ Traders' );
$url = 'http://sister/products';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_json = curl_exec($ch);
curl_close($ch);
$response=json_decode($response_json, true);
![Page 112: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/112.jpg)
PHP cURL: Mengupdate Produk Tertentu
$data = array( 'product_name' => 'Laptop’, 'price' => 1200, 'quantity' => 15, 'seller' => 'ABC Trading Inc.' );
$url = 'http://example.com/api/products/3'; $ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_json = curl_exec($ch); curl_close($ch);
$response=json_decode($response_json, true);
![Page 113: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/113.jpg)
PHP cURL: Menghapus Produk Tertentu
$url = 'http://sister/products/7'; $ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response_json = curl_exec($ch); curl_close($ch);
$response=json_decode($response_json, true);
![Page 114: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/114.jpg)
Membangun RESTful Web Service dengan Framework Slim
![Page 115: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/115.jpg)
https://www.slimframework.com/
• Download Composer (https://getcomposer.org) dan install
• Instalasi Slim:• Buka Terminal, masuk ke htdocs
composer create-project slim/slim-skeleton [nama_app]
• Misal:composer create-project slim/slim-skeleton slim_api -vvv
• Slim_api adalah nama direktori proyek yang akan dibuat. • argumen -vvv berfungsi untuk menampilkan detail proses instalasi
• Masuk ke folder web service via Console, jalankan Web Server PHP (atau Apache):
php –S localhost:8080 –t index.php
• Atau gunakan perintah composer start
![Page 116: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/116.jpg)
Slim Berjalan? http://localhost:8080
![Page 117: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/117.jpg)
Membuat Database
• Buat database bernama “db_koleksi_buku”
• Setelah itu buat tabel tb_buku dengan 5 field: • Id_buku untuk menyimpan id buku;
• Judul untuk menyimpan judul buku;
• Penulis untuk menyimpan nama pengarang;
• Sinopsis untuk menyimpan teks sinopsis;
• Cover untuk menyimpan nama file sampul buku
![Page 118: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/118.jpg)
![Page 119: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/119.jpg)
Kode SQL: Membuat Tabel books
CREATE TABLE books (
book_id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
sinopsis TEXT NOT NULL,
cover VARCHAR(255) NOT NULL DEFAULT 'default_cover.png',
PRIMARY KEY (`book_id`)
) ENGINE = InnoDB;
![Page 120: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/120.jpg)
Kode SQL: Membuat Tabel api_users
• Selanjutnya buat tabel api_users dengan field: • email untuk menyimpan email user. Email bersifat unik, jadi 1 API key hanya dimiliki
oleh satu user. • api_key untuk menyimpan API key user. API Key bersifat unik. • hit untuk menyimpan berapa kali api diakses oleh user. Biasanya digunakan untuk
membatasi akses.
CREATE TABLE api_users (
email VARCHAR(255) NOT NULL, api_key VARCHAR(255) NOT NULL, hit INT NOT NULL, PRIMARY KEY (`email`), UNIQUE (`api_key`)
) ENGINE = InnoDB;
![Page 121: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/121.jpg)
Masukkan Data Contoh
• INSERT INTO `api_users` (`email`, `api_key`, `hit`) VALUES ('[email protected]', '123', '0');
• INSERT INTO `books` (`book_id`, `title`, `author`, `sinopsis`, `cover`) VALUES (NULL, 'Belajar Pemrograman PHP dari Nol Hingga Mahir', 'Muhar Dian', 'Buku ini membahas tentang tutorial step by step pemrograman php dari awal hingga membuat aplikasi web.', 'default_cover.png');
![Page 122: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/122.jpg)
File Penting
• Selama pengembangan RESTful API menggunakan Slim, ada 4 file utama yang akan dikonfigurasi atau diprogram
• Semuanya di dalam C:\xampp\htdocs\slim_api\src• dependencies.php :
• middleware.php :
• routes.php : penentuan rute
• settings.php : konfigurasi database, dll
![Page 123: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/123.jpg)
Konfigurasi Koneksi Database: src/settings.php
// Database Settings 'db' => [
'host' => 'localhost', 'user' => 'root', 'pass' => ‘’, 'dbname' => ‘db_koleksi_buku', 'driver' => 'mysql'
]
![Page 124: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/124.jpg)
Container Database: src/depedencies.php
// database
$container['db'] = function ($c){
$settings = $c->get('settings')['db'];
$server = $settings['driver'].":host=".$settings['host'].";dbname=".$settings['dbname'];
$conn = new PDO($server, $settings["user"], $settings["pass"]);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $conn;
};
![Page 125: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/125.jpg)
Membuat Rute
Rute Metode Parameter Keterangan
/books/ GET key Untuk mengambil semua buku
/books/1 GET key Menampilkan 1 buku berdasarkan id
/books/search GET key, keyword Untuk mencari buku
/books POST key Untuk menambahkan buku baru
/books/1 PUT key Untuk mengedit data buku
/books/1 DELETE key Untuk menghapus buku
Contoh: /books/search?key=123&keyword=bukuphp
![Page 126: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/126.jpg)
Rute pertama ke dalam src/routes.php
• Rute GET /books/, mengambil semua buku - URL: http://localhost:8080/books/
$app->get("/books/", function (Request $request, Response $response){
$sql = "SELECT * FROM tb_buku";
$stmt = $this->db->prepare($sql);
$stmt->execute()
$result = $stmt->fetchAll();
return $response->withJson(["status" => "success",
"data" => $result], 200);
});
![Page 127: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/127.jpg)
Rute GET /books/1
$app->get("/books/{id}",
function (Request $request, Response $response, $args){
$id = $args["id"];
$sql = "SELECT * FROM tb_buku WHERE book_id=:id";
$stmt = $this->db->prepare($sql);
$stmt->execute([":id" => $id]);
$result = $stmt->fetch();
return $response->withJson(["status" => "success",
"data" => $result], 200);
});
![Page 128: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/128.jpg)
Rute GET /books/search
Rute untuk pencarian buku berdasarkan judul, sinopsis, dan nama penulis
$app->get("/books/search/",
function (Request $request, Response $response, $args){
$keyword = $request->getQueryParam("keyword");
$sql = "SELECT * FROM books WHERE title LIKE '%$keyword%' OR sinopsis LIKE '%$keyword%' OR author LIKE '%$keyword%'";
$stmt = $this->db->prepare($sql);
$stmt->execute([":id" => $id]);
$result = $stmt->fetchAll();
return $response->withJson(["status" => "success",
"data" => $result], 200);
});
![Page 129: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/129.jpg)
Rute POST /books
Rute ini diakses dengan metode POST. Rute ini untuk menambah data buku baru
$app->post("/books/", function (Request $request, Response $response){ $new_book = $request->getParsedBody(); $sql = "INSERT INTO books (title, author, sinopsis) VALUE (:title, :author, :sinopsis)"; $stmt = $this->db->prepare($sql); $data = [
":title" => $new_book["title"], ":author" => $new_book["author"], ":sinopsis" => $new_book["sinopsis"]
];if($stmt->execute($data)) return $response->withJson(["status" => "success", "data" => "1"], 200); return $response->withJson(["status" => "failed", "data" => "0"], 200);
});
![Page 130: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/130.jpg)
Rute PUT /books/1
Rute ini bertugas untuk mengubah data buku berdasarkan ID.
$app->put("/books/{id}", function (Request $request, Response $response, $args){
$id = $args["id"];
$new_book = $request->getParsedBody();
$sql = "UPDATE books SET title=:title, author=:author,
sinopsis=:sinopsis WHERE book_id=:id";
$stmt = $this->db->prepare($sql);
$data = [
":id" => $id,
":title" => $new_book["title"],
":author" => $new_book["author"],
":sinopsis" => $new_book["sinopsis"]
];
if($stmt->execute($data))
return $response->withJson(["status" => "success", "data" => "1"], 200);
return $response->withJson(["status" => "failed", "data" => "0"], 200);
});
![Page 131: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/131.jpg)
Rute DELETE /books/1
$app->delete("/books/{id}",
function (Request $request, Response $response, $args){
$id = $args["id"];
$sql = "DELETE FROM books WHERE book_id=:id";
$stmt = $this->db->prepare($sql);
$data = [":id" => $id];
if($stmt->execute($data))
return $response->withJson(["status" => "success", "data" => "1"], 200);
return $response->withJson(["status" => "failed", "data" => "0"], 200);
});
![Page 132: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/132.jpg)
Middleware untuk Validasi API Key
![Page 133: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/133.jpg)
Middleware
• Fungsi yang akan dieksekusi di setiap ada request yang masuk ke aplikasi.
• Middleware biasanya digunakan untuk validasi Key dari API, membuat login, mencatat logs, dan lain-lain.
![Page 134: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/134.jpg)
src/middleware.php <?php
// Application middleware
// e.g: $app->add(new \Slim\Csrf\Guard);
// middleware untuk validasi api key
$app->add(function ($request, $response, $next) {
$key = $request->getQueryParam("key");
if(!isset($key)){ return $response->withJson(["status" => "API Key required"], 401); }
$sql = "SELECT * FROM api_users WHERE api_key=:api_key";
$stmt = $this->db->prepare($sql);
$stmt->execute([":api_key" => $key]);
if($stmt->rowCount() > 0){
$result = $stmt->fetch();
if($key == $result["api_key"]){
// update hit
$sql = "UPDATE api_users SET hit=hit+1 WHERE api_key=:api_key";
$stmt = $this->db->prepare($sql);
$stmt->execute([":api_key" => $key]);
return $response = $next($request, $response);
}
}
return $response->withJson(["status" => "Unauthorized"], 401);
});
![Page 135: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/135.jpg)
Maksud dari kode tersebut
• Cek parameter key;
• Ambil data di database berdasarkan parameter key;
• Bandingkan parameter key dengan api_key yang tersimpan di database;
• Jika benar, tampilkan data yang diminta dan tambahkan hit.
![Page 136: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/136.jpg)
Akses http://localhost:8080,
• Aplikasi meminta API Key.
![Page 137: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/137.jpg)
Tambahkan Parameter ?key=123.
![Page 138: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/138.jpg)
Bila API key-nya salah?
![Page 139: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/139.jpg)
Middleware Selektif
• Menuliskan middleware seperti sebelumnya, mengakibatkan semua rute membutuhkan API Key.
• Jika diinginkan pengecekan API key hanya pada rute tertentu, maka harus ditambahkan middleware pada rute tersebut.
• Contoh: // membuat middleware $cekAPIKey = function($request, $response, $next){ // ini middleware untuk cek apikey }
// menambahkan middleware ke route $app->get('/books', function ($request, $response) { // ... })->add(cekAPIKey());
![Page 140: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/140.jpg)
Pengelompokan Rute
• Middleware dapat pula ditambahkan ke route group.
• Contoh:
$app->group('/api', function () use ($app) {
$app->get('/books', function ($request, $response) {
// ...
});
$app->get('/books/{id}', function ($request, $response) {
// ...
});
})->add(cekAPIKey());
![Page 141: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/141.jpg)
Uji Coba Aplikasi dengan Postman
• Slim akan otomatis mengubahnya menjadi array asosiatif, karena itu digunakan fungsi $this->getParsedBody() untuk mengambilnya.
![Page 142: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/142.jpg)
Contoh RESTful APILogin dan Register Berbasis Session
![Page 143: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/143.jpg)
Persiapan
• Buat folder bernama restapi
• Masuk ke folder restapi tersebut dan install Slim:composer require slim/slim “^3.0”
• Buat folder example, tempat kita menempatkan 6 file berikut:• login.php • delete.php • index.php • edit.php • register.php • logout.php
• Folder example digunakan untuk memanggil layanan REST API (sisi consumer/client dari RESTful Web Service)
![Page 144: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/144.jpg)
login.php
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h3>Simple example how to create rest api and use http method with slim framework by
seegatesite.com</h3>
<h2>GET METHOD</h2>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> ">
<table>
<tr>
<td>Email :</td>
<td><input type="email" name="email"></td>
</tr>
<tr>
<td>Password :</td>
<td><input type="password" name="password"></td>
</tr>
![Page 145: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/145.jpg)
<tr>
<td><input type="submit" name="submit" value="login"></td>
</tr>
</table>
</form>
A new user ? <a href="register.php">register</a>
<?php
if(isset($_POST['submit'])) {
if (!empty($_POST['email']) and !empty($_POST['password'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$ch =
curl_init('http://localhost/restapi/api/get/login/'.$email.'/'.$password)
;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
![Page 146: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/146.jpg)
($ch);
curl_close($ch);
$data = json_decode($response,true);
if($data['data']['islogin'] == true) {
$_SESSION['email'] = $data['data']['email'];
$_SESSION['password'] = $data['data']['password'];
$_SESSION['name'] = $data['data']['name'];
$_SESSION['country'] = $data['data']['country'];
header("location:index.php");
} else {
echo '
<hr />
'.$data['message'];
}
}else {
echo 'Please fill the Email or Password ';
}
}
?>
</body>
</html>
Deskripsi : Halaman login akan mengimplementasikan PHP curl untuk mengajukan requests dengan metode GET.
![Page 147: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/147.jpg)
register.php <!DOCTYPE html>
<html>
<head>
<title>Register Page</title>
</head>
<body>
<h3>Menu Register</h3>
<h2>POST METHOD</h2>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> " >
<table>
<tr> <td>Email :</td> <td><input type="email" name="email"></td> </tr>
<tr> <td>Password :</td> <td><input type="password" name="password"></td> </tr>
<tr> <td>Name :</td> <td><input type="text" name="name"></td> </tr>
<tr> <td>Country :</td> <td><input type="text" name="country"></td> </tr>
<tr> <td><input type="submit" name="submit" value="Register"></td> </tr>
</table>
</form>
![Page 148: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/148.jpg)
You need login? <a href="login.php">Login page</a>
<?php if(isset($_POST['submit'])) {
if (!empty($_POST['email']) and !empty($_POST['password’]) and
!empty($_POST['name']) and !empty($_POST['country'])) {
$email = $_POST['email']; $password = $_POST['password’];
$name = $_POST['name']; $country = $_POST['country’];
$post = array('email' => $email, 'password' => $password,
'name' => $name, 'country' => $country);
$data = json_encode($post);
$ch = curl_init('http://localhost/restapi/api/post/register');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response,true);
echo '<hr /> '.$data['message'];
} else { echo 'Please fill Data '; }
}
?>
</body>
</html>
Deskripsi: Halaman register akan mengimplementasikan PHP curl untuk membuat make requests dengan metode POST.
![Page 149: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/149.jpg)
index.php <?php
session_start();
if(!isset($_SESSION['email'])) { header("location:login.php"); }
?>
<!DOCTYPE html>
<html><head><title>Welcome home </title></head>
<body>
Welcome to Home <a href="logout.php">Logout</a>
<hr>
<table>
<tr> <td> Name : </td> <td> <?php echo $_SESSION['name']; ?> </td> </tr>
<tr> <td> Email : </td> <td> <?php echo $_SESSION['email']; ?> </td> </tr>
<tr> <td> country : </td> <td> <?php echo $_SESSION['country']; ?> </td> </tr>
<tr> <td> <a href="edit.php">Edit</a> <a href="delete.php">Delete</a> </td> </tr>
</table>
</body>
</html>
![Page 150: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/150.jpg)
edit.php <?php session_start(); if(!isset($_SESSION['email'])) { header("location:login.php"); } ?>
<!DOCTYPE html>
<html>
<head>
<title>Edit Page</title>
</head>
<body>
<?php if(isset($_POST['submit'])) { if ( !empty($_POST['password']) and !empty($_POST['name']) and
!empty($_POST['country'])) { $email = $_POST['email']; $password = $_POST['password']; $name =
$_POST['name']; $country = $_POST['country']; $post = array( 'password' => $password, 'name' => $name,
'country' => $country);
$data = json_encode($post);
$ch = curl_init('http://localhost/restapi/api/put/edit/'.$email);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response,true);
echo '<hr /> '.$data['message'];
Deskripsi: Halaman edit akan mengimplementasikan PHP curl untuk membuat requests dengan metode PUT.
![Page 151: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/151.jpg)
$_SESSION['email'] = $data['data']['email'];
$_SESSION['password'] = $data['data']['password'];
$_SESSION['name'] = $data['data']['name'];
$_SESSION['country'] = $data['data']['country'];
echo '<hr/><a href="index.php">Back to dashboard</a>';
}else {
echo 'Please fill Data ';
}
}
?>
<h1>PUT METHOD</h1>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> " >
<table>
<tr>
<td>Email :</td>
<td><input type="email" readonly value="<?php echo $_SESSION['email'] ?>" name="email"></td>
</tr>
![Page 152: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/152.jpg)
<tr><td>Password :</td>
<td><input type="password" value="<?php echo $_SESSION['password'] ?>"
name="password"></td>
</tr>
<tr><td>Name :</td>
<td><input type="text" value="<?php echo $_SESSION['name'] ?>"
name="name"></td>
</tr>
<tr><td>Country :</td>
<td><input type="text" value="<?php echo $_SESSION['country'] ?>"
name="country"></td>
</tr>
<tr><td><input type="submit" name="submit" value="Edit"></td></tr>
</table>
</form>
</body>
</html>
![Page 153: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/153.jpg)
delete.php
<?php session_start(); if(!isset($_SESSION['email'])) { header("location:login.php"); } ?>
<!DOCTYPE html>
<html>
<head> <title>delete Page</title> </head>
<body>
<h1>DELETE METHOD</h1>
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?> " >
<table>
<tr><td>Email :</td><td><input type="email" readonly value="<?php echo $_SESSION['email'] ?>"
name="email"></td></tr>
<tr><td>Password :</td><td><input type="password" value="<?php echo $_SESSION['password'] ?>"
name="password"></td></tr>
<tr><td>Name :</td><td><input type="text" value="<?php echo $_SESSION['name'] ?>"
name="name"></td></tr>
<tr><td>Country :</td><td><input type="text" value="<?php echo $_SESSION['country'] ?>"
name="country"></td></tr>
<tr><td><input type="submit" name="submit" value="Delete this account ?"></td></tr>
</table>
</form>
Deskripsi: Halaman delete akan mengimplementasikan PHP curl untuk membuat requests dengan metode DELETE.
![Page 154: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/154.jpg)
<?php
if(isset($_POST['submit'])) {
$email = $_SESSION['email’];
$ch = curl_init('http://localhost/restapi/api/delete’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response,true);
print_r($data);
if($data['status'] == 200) {
header("location:logout.php");
} else { echo 'error : '.json_decode($response); }
}
?>
</body>
</html>
![Page 155: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/155.jpg)
logout.php
<?php session_start(); unset($_SESSION['email']); unset($_SESSION['password']); unset($_SESSION['name']); unset($_SESSION['country']); header("location:login.php");
?>
![Page 156: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/156.jpg)
RESTful API (router.php): Lengkap
$app->delete('/delete', function($request, $response,$args) {
if(file_exists('data.json')) {
unlink("data.json");
}
$array['status'] = '200';
$array['message'] = 'delete success';
$array['data'] = array("islogin"=>false);
return $response->withStatus(200)
->withHeader("Content-Type","application/json")
->write(json_encode($array));
});
![Page 157: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/157.jpg)
$app->get('/get/login/{email}/{password}', function($request, $response,$args) {
$email = $args['email'];
$password =$args['password'];
if(file_exists('data.json')) {
$datajson = json_decode(file_get_contents('data.json'), true);
foreach ($datajson as $key) {
$data['email'] = $key['email']; $data['password'] = $key['password'];
$data['name'] = $key['name’]; $data['country'] = $key['country'];
}
}else { $data['email'] = ‘’; $data['password'] = ‘’;
$data['name'] = ‘’; $data['country'] = '';
}
if($email == $data['email'] and $password == $data['password’]) {
$array['status'] = '200’; $array['message'] = 'login success';
$array['data'] = array("islogin"=>true, "name"=>$data['name’], "country"=>$data['country’],
"email"=>$data['email'], password"=>$data['password']);
} else { $array['status'] = '401’; $array['message'] = 'Unauthorized User’;
$array['data']= array("islogin"=>false,"name"=>$data['email'],"country"=>'');
}
return $response->withStatus(200)
->withHeader("Content-Type","application/json")
->write(json_encode($array));
});
GET /get/login/{email}/{password}
![Page 158: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/158.jpg)
POST/post/register
$app->post('/post/register', function($request, $response){
$datajson = array();
$data = json_decode($request->getBody(),true);
$datajson[] = $data;
$fp = fopen('data.json', 'w');
fwrite($fp, json_encode($datajson));
fclose($fp);
$array['status'] = '200';
$array['message'] = 'register success';
$array['data’] = array("islogin"=>false);
return $response->withStatus(200)
->withHeader("Content-Type","application/json")
->write(json_encode($array));
});
![Page 159: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/159.jpg)
PUT/put/edit/{email}
$app->put('/put/edit/{email}', function($request, $response,$args){
$email = $args['email'];
$datajson = array();
$data = json_decode($request->getBody(),true);
$data['email'] = $email;
$datajson[] = $data;
$fp = fopen('data.json', 'w');
fwrite($fp, json_encode($datajson));
fclose($fp);
$array['status'] = '200';
$array['message'] = 'Edit Success';
$array['data'] = array("islogin"=>true, "name"=>$data['name'],
"country"=>$data['country'], "email"=>$data['email'],
"password"=>$data['password']);
return $response->withStatus(200)
->withHeader("Content-Type","application/json")
->write(json_encode($array));
});
$app->run();
![Page 160: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/160.jpg)
• Deskripsi: Untuk menjawab request dalam format json pada Slim Framework menggunakan fungsi-fungsi berikut:
return $response->withStatus(200) ->withHeader("Content-Type","application/json") ->write(json_encode($array));
![Page 161: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/161.jpg)
404
• Handler jika request tidak ditemukan (404), menggunakan fungsi berikut:
$c['notFoundHandler'] = function ($c) { return function ($request, $response) use ($c) {
$array = array('Status'=>'404','Message'=>'Page not found'); return $c['response’]
->withStatus(404) ->withHeader("Content-Type","application/json") ->write(json_encode($array));
}; };
![Page 162: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/162.jpg)
.htaccess
• Deskripsi: Skrip di atas digunakan untuk membuat link yang lebih baik.
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L]
![Page 163: Pemrograman RESTful API - komputasi.files.wordpress.com · •Resources dikenali dengan global ID (biasanya berupa URI atau URL). •REST memungkinkan resources tersebut mempunyai](https://reader034.vdocuments.site/reader034/viewer/2022050903/5c88c17a09d3f21d318bd3d8/html5/thumbnails/163.jpg)