Merancang API RESTful dengan nested resource



Merancang API RESTful dengan nested resource dan pertanyaan kompleks memerlukan pertimbangan teliti untuk memastikan ia adalah intuitif, efisien, dan mudah diselenggara. Berikut adalah beberapa amalan terbaik untuk mencapainya:

1. Gunakan URL Hierarki untuk Nested Resource

URL hierarki membantu untuk mentakrifkan hubungan antara sumber dengan jelas. Sebagai contoh, jika anda mempunyai pengguna dan pos, anda boleh gunakan:

  • /users/{userId}/posts: Mendapatkan pos untuk pengguna tertentu.
  • /users/{userId}/posts/{postId}: Mendapatkan pos tertentu untuk pengguna tertentu.

2. Kekalkan Konsistensi dalam Struktur URL

Konsistensi dalam pola URL menjadikan API lebih mudah diramal dan mudah digunakan. Kekalkan struktur yang jelas dan konsisten sepanjang API anda.

3. Gunakan Kaedah HTTP yang Sesuai

Gunakan kaedah HTTP standard untuk menunjukkan tindakan:

  • GET untuk mendapatkan sumber.
  • POST untuk mencipta sumber.
  • PUT/PATCH untuk mengemas kini sumber.
  • DELETE untuk memadam sumber.

4. Gunakan Parameter Pertanyaan untuk Penapisan, Pengisihan, dan Penomboran

Untuk pertanyaan kompleks, gunakan parameter pertanyaan untuk mengendalikan penapisan, pengisihan, dan penomboran. Ini memastikan URL bersih dan membolehkan pertanyaan yang fleksibel.

  • /posts?userId=1&sort=created_at&order=desc&page=2

5. Sahkan dan Bersihkan Input

Sentiasa sahkan dan bersihkan input untuk mencegah suntikan SQL dan kerentanan keselamatan lain. Gunakan kaedah pengesahan terbina dalam Laravel.

6. Laksanakan Pengendalian Ralat yang Betul

Kembalikan mesej ralat yang bermakna dan kod status HTTP yang sesuai. Sebagai contoh, kembalikan 404 Not Found jika sumber tidak ditemui dan 400 Bad Request untuk ralat pengesahan.

7. Gunakan Eloquent untuk Pertanyaan Kompleks

Manfaatkan keupayaan pertanyaan kuat Eloquent untuk pertanyaan kompleks. Gunakan hubungan, skop, dan kaedah pembina pertanyaan untuk membina pertanyaan kompleks.

8. Optimumkan untuk Prestasi

Pertimbangkan pengoptimuman prestasi seperti pemuatan eager untuk mengurangkan bilangan pertanyaan:

$users = User::with('posts.comments')->get();

9. Gunakan Kelas Sumber untuk Respons JSON

Gunakan kelas sumber Laravel untuk memformat respons JSON dengan konsisten:

return new UserResource($user);

10. Versi API Anda

Versi API anda untuk mengendalikan perubahan dengan lancar tanpa memecahkan klien yang sedia ada:

  • /v1/users/{userId}/posts
  • /v2/users/{userId}/posts

Contoh Takrifan Laluan Nested Resource dalam Laravel

use App\Http\Controllers\UserController;
use App\Http\Controllers\PostController;
use App\Http\Controllers\CommentController;

// Laluan Pengguna
Route::prefix('users')->group(function () {
    Route::get('/', [UserController::class, 'index']);
    Route::get('/{userId}', [UserController::class, 'show']);

    // Laluan Pos untuk Pengguna
    Route::prefix('{userId}/posts')->group(function () {
        Route::get('/', [PostController::class, 'indexByUser']);
        Route::get('/{postId}', [PostController::class, 'show']);

        // Laluan Komen untuk Pos
        Route::prefix('{postId}/comments')->group(function () {
            Route::get('/', [CommentController::class, 'indexByPost']);
            Route::get('/{commentId}', [CommentController::class, 'show']);
        });
    });
});

Contoh Eloquent untuk Pertanyaan Kompleks

Menggunakan Eloquent untuk mengendalikan pertanyaan kompleks dengan hubungan:

class PostController extends Controller
{
    public function indexByUser(Request $request, $userId)
    {
        $query = Post::where('user_id', $userId);

        // Terapkan penapisan
        if ($request->has('category')) {
            $query->where('category_id', $request->category);
        }

        // Terapkan pengisihan
        if ($request->has('sort')) {
            $sortOrder = $request->get('order', 'asc');
            $query->orderBy($request->sort, $sortOrder);
        }

        // Penomboran
        $posts = $query->paginate(10);

        return PostResource::collection($posts);
    }

    public function show($userId, $postId)
    {
        $post = Post::where('user_id', $userId)->findOrFail($postId);
        return new PostResource($post);
    }
}

Dengan mengikuti amalan terbaik ini, anda boleh merancang API RESTful yang kukuh, mudah digunakan, dan mudah diselenggara, walaupun dengan nested resource dan pertanyaan kompleks.

Ulasan