Menu
CoddyTech

Sürümleme

Coddy'nin Node.js Journey'sinin REST API'leri bölümünün bir parçası. Ders 15 / 18.

Bir yanıtın biçimini değiştirmek, onu zaten kullanan tüm istemcileri bozar. Yoldaki bir sürüm, eski ve yeni istemcilerin yan yana çalışmasını sağlar: bugün /api/v1/orders, biçim değiştiğinde /api/v2/orders. Yeri değişen yollar bir yönlendirme yanıtı verir:

GET  /api/orders/5   →  308  Location: /api/v1/orders/5
POST /api/orders     →  308  Location: /api/v1/orders

301 ve 302, istemcilerin bir POST isteğini GET olarak yinelemesine izin verir; bu da gövdenin kaybolmasına neden olur. 308, yöntem ve gövde dahil olmak üzere "aynı isteği orada yinele" der. Bağlanmış bir ara katman yazılımının içinde req.url bağlama yolunu kaybetmişken req.originalUrl yolun tamamını korur:

// GET /api/orders/5?full=1 için app.use('/api/orders', ...) içinde
req.url          // '/5?full=1'
req.originalUrl  // '/api/orders/5?full=1'
challenge icon

Görev

Kolay
  • Görevler yönlendiricisini /api/v1/tasks adresine bağla.
  • Eski /api/tasks yollarının her biri, sorgu dizesi de dahil olmak üzere /api/v1 altındaki aynı yola 308 yanıtı verir.
  • Yeni görevler Location: /api/v1/tasks/<id> alır.

GET /api/tasks/2 isteğini gönder, { "title": "Order new chairs" } içeren /api/tasks adresine POST isteği gönder, ardından GET /api/v1/tasks/2 isteğini gönder.

Kendin dene

import express from 'express';
import { sendError } from './errors.js';
import taskRoutes from './routes/tasks.js';

const BOARD_ORIGIN = 'https://board.example.com';

const app = express();
app.use(express.json());

// BOARD_ORIGIN üzerindeki sayfaların tarayıcıdan bu API'yi çağırmasına izin verir.
app.use((req, res, next) => {
    res.set('Access-Control-Allow-Origin', BOARD_ORIGIN);
    res.set('Access-Control-Allow-Credentials', 'true');
    if (req.method === 'OPTIONS') {
        res.set('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE');
        res.set('Access-Control-Allow-Headers', 'Content-Type');
        return res.status(204).end();
    }
    next();
});

app.use(express.static('public'));

app.use('/api/tasks', taskRoutes);

// Rotalardan gelen hatalar burada ele alınır. Geçerli JSON olmayan bir gövde,
// istemcinin hatasıdır (400); diğer tüm hatalar bize aittir (500).
app.use((err, req, res, next) => {
    if (err.type === 'entity.parse.failed') {
        return sendError(res, 400, 'invalid_json', 'The body is not valid JSON');
    }
    console.error(err);
    sendError(res, 500, 'server_error', 'Something went wrong');
});

app.listen(3000, () => {
    console.log('Task tracker API on port 3000');
});

REST API'leri bölümündeki tüm dersler