# RESTful API (Read)

## Jalankan XAMPP

Pilih start menu - XAMPP Control Panel

![](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7NajJLacPN7oCKCQ2%2F-MP7T6ffQVc_Hq83Tfvw%2Fimage.png?alt=media\&token=96513e26-97a3-42b7-9ef6-df01580fd2a3)

Pilih Actions Start pada service apache dan mysql

![](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7NajJLacPN7oCKCQ2%2F-MP7SHcNc7D-_2JzW69D%2Fimage.png?alt=media\&token=71d97f7e-888e-480b-b913-4cf8ee903dc2)

{% hint style="info" %}
Perhatikan pada kolom Port(s):\
Pada laptop saya, apache menggunakan port 81 (http), 443 (https), sedangkan mysql menggunakan port 3306.
{% endhint %}

## Membuat Database dan Tabel

Buat database mysql dengan nama : **db\_express**

Buat tabel dengan nama : **mahasiswa**

### Menggunakan MySQL Workbench

{% embed url="<https://drive.google.com/file/d/1Hn8J0O3Tu4QL24PRhtg-qIyxfKVeBUgA/view>" %}

### Menggunakan phpMyAdmin

{% embed url="<https://drive.google.com/file/d/1cXYK_Q246VOu8bb1OwkLBZz_bs34fu8i/view>" %}

## Buat Direktori Project

Buat direktori project dengan nama : **restful-api**

![](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7NajJLacPN7oCKCQ2%2F-MP7WxG13vJLA-Q6q62k%2Fimage.png?alt=media\&token=1bf5f806-d283-47ec-9773-610a497059ee)

Buat file package.json dengan menjalankan perintah di bawah ini:

```
npm init
```

![](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7NajJLacPN7oCKCQ2%2F-MP7YMx1LCsKZ5HYtPGx%2Fimage.png?alt=media\&token=09273a26-ae57-4252-b58c-fd8bebd0ed58)

Lalu instal express, mysql dan body-parser dengan menjalan perintah di bawah ini:

```
npm install express mysql body-parser --save 
```

![](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7NajJLacPN7oCKCQ2%2F-MP7ZeSuyZ63FJMO-XIQ%2Fimage.png?alt=media\&token=8ff74e3a-d29a-4300-9cf7-e217e95659d1)

## Buat File index.js

File index.js merupakan file yang pertama kali diakses.

```javascript
const express = require('express'), // panggil modul express
    app = express(),
    port = process.env.PORT || 3000,
    bodyParser = require('body-parser'), // panggil modul body-parser
    controller = require('./controller'), // panggil controller.js
    routes = require('./routes'); // panggil routes.js

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

routes(app);

app.listen(port);
console.log('RESTful API server started on: ' + port);
```

`process.env.PORT || 3000`, maksudya menyesuaikan PORT yang disediakan pada platform seperti [Heroku](https://www.heroku.com/), jika tidak ada maka PORT 3000 yang digunakan.  Pada server localhost port yang akan digunakan adalah PORT 3000.

`controller` dan `routes` merupakan file modul yang dibuat terpisah dengan tujuan agar code lebih rapi, terstruktur, dan code tidak berada di index.js semua.

body-parser berfungsi untuk memparsing (cara memecah-mecah suatu rangkaian masukan) permintaan yang masuk (<https://github.com/expressjs/body-parser>)

## Buat File conn.js

File conn.js menghubungkan aplikasi ke database mysql.

```javascript
const mysql = require('mysql'); // panggil modul mysql

const con = mysql.createConnection({
  host: "localhost",
  user: "root", // user mysql : root
  password: "", // pass mysql : default (tidak ada)
  database: "db_express" // nama database
});

con.connect(function (err){
    if(err) throw err;
});

module.exports = con;
```

## Buat File controller.js

```javascript
'use strict';

const response = require('./res'); // panggil res.js
const connection = require('./conn'); // panggil conn.js

exports.users = function(req, res) {
    connection.query('SELECT * FROM mahasiswa', function (error, rows, fields){
        if(error){
            console.log(error)
        } else{
            response.ok(rows, res)
        }
    });
};

exports.index = function(req, res) {
    response.ok("Hello from the Node JS RESTful side!", res)
};
```

`'use strict';` merupakan ekspresi literal javascript untuk menunjukkan bahwa kode harus dijalankan dalam mode strict. Dengan mode strict, kita tidak dapat, misalnya, menggunakan variabel yang tidak dideklarasikan. (<https://www.w3schools.com/js/js_strict.asp>)

`'SELECT * FROM  mahasiswa'` merupakan query untuk mengakses data yang ada di tabel mahasiswa.

`response.ok(rows, res)` memanggil exports.ok yang ada di file res.js dengan mengirimkan parameter rows dan res.

## Buat File res.js

File res.js merupakan file untuk membuat standarisasi respon yang akan dikembalikan.  Standarisasi respon ini nantinya sangat membantu frontend web developer.

```javascript
'use strict';

exports.ok = function(values, res) {
  let data = {
      'status': 200,
      'values': values
  };
  res.json(data);
  res.end();
};
```

`values` disini merupakan parameter `rows` yang dikirim dari exports.users pada controller.js

`res.json(data)` mengirimkan data (status dan values) dalam bentuk json

`res.end()` menutup atau mengakhiri koneksi ke database

HTTP response status code dapat dilihat di <https://developer.mozilla.org/id/docs/Web/HTTP/Status>&#x20;

## Buat File routes.js

File routes.js berisi route atau endpoint yang dapat diakses

```javascript
'use strict';

module.exports = function(app) {
    let todoList = require('./controller'); // panggil controller.js

    // endpoint http://localhost:3000
    app.route('/')
        .get(todoList.index);

    // endpoint http://localhost:3000/users
    app.route('/users')
        .get(todoList.users); 
};
```

## Jalankan node index.js

Silakan jalankan index.js dengan perintah

```javascript
node index.js
```

Silakan akses <http://localhost:3000> dan <http://localhost:3000/users> dari browser atau menggunakan aplikasi insomina atau postman.

![Respon http://localhost:3000](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7tF_8cSnQaRj78Azl%2F-MP7zINBsxYVH_yL67IT%2Fimage.png?alt=media\&token=b9df590c-fee0-456f-bc6b-9e3e62940e4c)

![Respon http://localhost:3000/users](https://778745197-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MHJa7RRM_GMgqanJvvL%2F-MP7tF_8cSnQaRj78Azl%2F-MP7zNxCnVNk6_KAsCCM%2Fimage.png?alt=media\&token=6284c8d0-b07b-44ab-8464-be0144a86da7)

## Referensi

{% embed url="<https://kiddyxyz.medium.com/tutorial-restful-api-node-js-express-mysql-part-1-527868bfb9d1>" %}

{% embed url="<https://stackoverflow.com/questions/18864677/what-is-process-env-port-in-node-js>" %}

{% embed url="<https://www.heroku.com/>" %}
