Rumah > pembangunan bahagian belakang > tutorial php > Bina API rehat dari awal: Pengenalan

Bina API rehat dari awal: Pengenalan

Joseph Gordon-Levitt
Lepaskan: 2025-02-20 11:48:12
asal
965 orang telah melayarinya

Build a REST API from Scratch: An Introduction

Ekosistem Internet semasa telah diubah sepenuhnya oleh API, dan ada alasan yang baik. Dengan menggunakan API pihak ketiga dalam produk atau perkhidmatan anda, anda boleh mengakses pelbagai ciri berguna-seperti perkhidmatan pengesahan atau penyimpanan-yang memberi manfaat kepada anda dan pengguna anda. Dengan mendedahkan API anda sendiri, permohonan anda akan menjadi "sebahagian daripada komposisi" dan menggunakannya dengan cara yang anda tidak pernah berfikir ... Sudah tentu, jika anda melakukan ini dengan cara yang betul. Dalam siri dua bahagian ini, saya akan menunjukkan kepada anda bagaimana untuk membuat lapisan API yang tenang untuk aplikasi PHP anda menggunakan satu set amalan terbaik sebenar. Kod sumber lengkap untuk projek ini akan disediakan pada akhir Bahagian 2.

mata utama

    REST API adalah penting untuk perkhidmatan web moden dan menyediakan pemaju dengan antara muka mesra pengguna untuk mengakses dan memanipulasi data aplikasi.
  • Dokumen adalah penting;
  • Kerangka Slim, digabungkan dengan alat seperti Idiorm dan Monolog, boleh memanfaatkan keupayaan integrasi penghalaan dan middleware yang kuat untuk memudahkan pembangunan API yang cekap.
  • Melaksanakan HTTPS memastikan komunikasi yang selamat dan menghalang akses yang tidak dibenarkan kepada data yang dihantar antara pelanggan dan pelayan.
  • Pengendalian ralat berstruktur dalam format JSON meningkatkan ketersediaan API, menyediakan mesej ralat dan kod yang jelas yang memudahkan debugging dan integrasi.
  • Pengesahan melalui middleware seperti token atas pengesahan asas dan pemprosesan JSON adalah penting untuk melindungi dan mengurus interaksi API dengan berkesan.

REST: UI yang mesra pemaju

Pertama sekali, API adalah antara muka pengguna pemaju, jadi ia harus mesra, mudah, mudah digunakan, dan tentu saja menyenangkan; Walaupun ia hanya fail ReadMe yang mudah tetapi ditulis dengan baik, dokumentasi adalah permulaan yang baik. Maklumat yang paling sedikit yang kami perlukan adalah ringkasan skop perkhidmatan dan senarai kaedah dan titik akses. Ringkasan yang baik boleh: & gt; Ia mempunyai dua jenis objek, kenalan dan nota. Setiap kenalan mempunyai atribut asas seperti nama pertama, nama belakang, dan alamat e -mel. Di samping itu, setiap kenalan boleh mempunyai beberapa nota dalam format markdown yang berkaitan dengannya.

Kemudian, lebih baik menyenaraikan semua sumber dan operasi yang akan kami laksanakan. Ini boleh dianggap sebagai setara dengan menggambarkan wireframe aplikasi. Berikutan prinsip utama rehat, setiap sumber diwakili oleh URL di mana operasi adalah kaedah HTTP yang digunakan untuk mengaksesnya. Sebagai contoh, GET/API/Kenalan/12 akan mengambil kenalan dengan ID 12, manakala PUT/API/Kenalan/12 akan mengemas kini kenalan yang sama. Senarai kaedah lengkap adalah seperti berikut:

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回联系人数组
/api/contacts/:id GET          返回 ID 为 :id 的联系人
/api/contacts   POST         添加一个新联系人并返回它(添加了 id 属性)
/api/contacts/:id PUT          更新 ID 为 :id 的联系人
/api/contacts/:id PATCH        部分更新 ID 为 :id 的联系人
/api/contacts/:id DELETE       删除 ID 为 :id 的联系人

/api/contacts/:id/star PUT    将 ID 为 :id 的联系人添加到收藏夹
/api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人

/api/contacts/:id/notes GET   返回 ID 为 :id 的联系人的笔记
/api/contacts/:id/notes/:nid GET   返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes POST  为 ID 为 :id 的联系人添加新笔记
/api/contacts/:id/notes/:nid PUT   更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk dokumentasi yang lebih lengkap dan profesional, anda boleh mempertimbangkan menggunakan alat seperti Swagger, Apidoc, atau Google API Discovery Service: Pengguna anda akan menyukai anda!

Alat dan Tetapan

Alat utama yang akan saya gunakan untuk membina API adalah kerangka tipis. Kenapa? & gt; [Ia] membantu anda menulis aplikasi web yang mudah dan kuat dan API dengan cepat.

Ini benar. Keupayaan penghalaannya yang kuat menjadikannya mudah untuk menggunakan kaedah selain daripada mendapatkan dan pos, ia memberikan sokongan terbina dalam untuk mengatasi kaedah HTTP (melalui tajuk HTTP dan medan pos tersembunyi) dan boleh disambungkan dengan middleware dan ciri tambahan untuk membolehkan program aplikasi dan API Pembangunan sangat mudah. Bersama -sama dengan Slim, saya menggunakan Idiorm untuk mengakses lapisan pangkalan data dan pembalakan menggunakan monolog. Oleh itu, fail komposer.json kami akan kelihatan seperti ini:

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Pakej Slim/Extras dan Slim/Middleware memberikan ciri -ciri berguna seperti resolusi jenis kandungan dan pengesahan asas. Kelas adat kami terletak di bawah ruang nama API dan di direktori Lib. Pada ketika ini, struktur direktori kerja kami adalah seperti berikut:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Pengawal depan aplikasi kami adalah awam/index.php, dan semua trafik bukan fail atau direktori diarahkan di sini melalui peraturan penulisan semula URL standard. Kemudian saya meletakkan semua kod inisialisasi dalam bootstrap.php dan kita akan lihat kemudian. Direktori saham mengandungi data seperti log, fail konfigurasi, pangkalan data SQLite dan fail dump, dan sijil SSL. Direktori bin mengandungi skrip utiliti yang menggunakan fail .sql yang disediakan untuk membuat pangkalan data dan mengimport beberapa data.

SSL ada di mana -mana

API kami hanya boleh diakses dalam mod HTTPS dan tidak memerlukan pengalihan semula. Ini memudahkan logik pengesahan dan menghalang pelanggan yang dikonfigurasikan secara tidak wajar daripada mengakses titik akhir yang tidak disulitkan. Cara paling mudah dan paling logik untuk menubuhkan kaedah ini adalah untuk bertindak secara langsung di pelayan web atau melalui pelayan proksi. Saya menggunakan Apache yang boleh dipercayai lama untuk melakukan ini, dan fail hos maya saya kelihatan seperti ini:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Mula -mula menentukan tetapan direktori supaya mereka biasa dengan versi HTTP dan HTTPS laman web kami. Dalam konfigurasi tuan rumah yang tidak selamat, saya menggunakan mod_rewrite untuk mengeluarkan kesilapan melarang 403 untuk sebarang sambungan yang tidak selamat, dan kemudian di bahagian keselamatan, saya menubuhkan SSL dengan sijil ditandatangani sendiri, serta pembolehubah slim_env yang memberitahu Langsing mod permohonan semasa. Untuk maklumat lanjut mengenai cara membuat sijil yang ditandatangani sendiri di Apache dan pasangkannya, lihat artikel ini di SSLShopper. Sekarang kita mempunyai matlamat yang jelas, struktur direktori asas, dan tetapan pelayan, mari kita jalankan komposer.phar memasang dan mula menulis beberapa kod.

program boot dan pengawal depan

Seperti yang dinyatakan sebelum ini, fail bootstrap.php bertanggungjawab untuk memuatkan tetapan aplikasi dan tetapan autoloader kami.

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回联系人数组
/api/contacts/:id GET          返回 ID 为 :id 的联系人
/api/contacts   POST         添加一个新联系人并返回它(添加了 id 属性)
/api/contacts/:id PUT          更新 ID 为 :id 的联系人
/api/contacts/:id PATCH        部分更新 ID 为 :id 的联系人
/api/contacts/:id DELETE       删除 ID 为 :id 的联系人

/api/contacts/:id/star PUT    将 ID 为 :id 的联系人添加到收藏夹
/api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人

/api/contacts/:id/notes GET   返回 ID 为 :id 的联系人的笔记
/api/contacts/:id/notes/:nid GET   返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes POST  为 ID 为 :id 的联系人添加新笔记
/api/contacts/:id/notes/:nid PUT   更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pertama, saya mendapat persekitaran semasa. Jika fail yang dinamakan .php wujud, ia dimuatkan, jika tidak, fail konfigurasi lalai dimuatkan. Tetapan khusus Slim disimpan dalam array $ config ['app'] dan diserahkan kepada pembina aplikasi yang memanjangkan objek Slim Asas (pilihan tetapi disyorkan). Contohnya, pernyataan:

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Konfigurasi logger monolog yang menulis ke fail aplikasi/path/share/log/envName_yyy-mm-dd.log. Kemudian, selepas beberapa penambahbaikan (anda dapat melihatnya dalam kod sumber), saya mendapat penulis log yang dihasilkan dan cuba menyambung ke pangkalan data:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Akhirnya, saya menambah middleware yang diperlukan untuk contoh aplikasi saya. Middleware Slim adalah seperti lapisan bawang, middleware pertama yang anda tambah akan menjadi lapisan paling dalam, jadi urutan middleware kami adalah penting. Saya menggunakan middleware berikut dalam API kami: - Cache (Tahap Dalam); badan "middleware utiliti amalan terbaik; - pengesahan (lapisan paling luar). Kami akan menulis semua ini, kecuali kandungan kandungan yang sedia ada. Pada akhir fail bootstrap, saya menentukan dua pembolehubah global $ App (AP) dan $ log (penulis log). Fail ini dimuatkan oleh index.php pengawal hadapan kami, dan sesuatu sihir berlaku dalam fail itu.

Struktur penghalaan

Slim mempunyai ciri yang bagus yang dipanggil kumpulan laluan. Menggunakan ciri ini, kami boleh menentukan laluan aplikasi kami seperti ini:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Saya mencipta dua kumpulan bersarang /API dan /V1 supaya kita dapat dengan mudah mematuhi amalan terbaik "Versi dalam URL". Saya juga membuat beberapa laluan pilihan untuk/API/yang mungkin mengandungi kandungan yang boleh dibaca pengguna, serta URL URL (/) akar biasa yang di dunia nyata mungkin mengandungi antara muka pengguna awam aplikasi.

middleware JSON

Pendekatan awal saya adalah menggunakan middleware routing (middleware tipis lain) dalam kumpulan /V1 untuk pengesahan dan permintaan JSON, tetapi saya mendapati ia lebih praktikal dan ringkas untuk menggunakan middleware klasik. Seperti yang dinyatakan sebelum ini, middleware adalah contoh kelas yang diwarisi dari SlimMiddleWare. Kaedah panggilan () middleware yang tipis adalah di mana operasi berlaku.

// Init application mode
if (empty($_ENV['SLIM_MODE'])) {
  $_ENV['SLIM_MODE'] = (getenv('SLIM_MODE'))
    ? getenv('SLIM_MODE') : 'development';
}

// Init and load configuration
$config = array();

$configFile = dirname(__FILE__) . '/share/config/'
  . $_ENV['SLIM_MODE'] . '.php';

if (is_readable($configFile)) {
  require_once $configFile;
} else {
  require_once dirname(__FILE__) . '/share/config/default.php';
}

// Create Application
$app = new API\Application($config['app']);
Salin selepas log masuk
Middleware JSON kami melaksanakan dua amalan terbaik: "JSON Response Only" dan "Body Pengekodan JSON". Kaedahnya adalah seperti berikut:

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回联系人数组
/api/contacts/:id GET          返回 ID 为 :id 的联系人
/api/contacts   POST         添加一个新联系人并返回它(添加了 id 属性)
/api/contacts/:id PUT          更新 ID 为 :id 的联系人
/api/contacts/:id PATCH        部分更新 ID 为 :id 的联系人
/api/contacts/:id DELETE       删除 ID 为 :id 的联系人

/api/contacts/:id/star PUT    将 ID 为 :id 的联系人添加到收藏夹
/api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人

/api/contacts/:id/notes GET   返回 ID 为 :id 的联系人的笔记
/api/contacts/:id/notes/:nid GET   返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes POST  为 ID 为 :id 的联系人添加新笔记
/api/contacts/:id/notes/:nid PUT   更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

kita boleh lulus laluan akar ke pembina middleware. Dalam kes ini, saya lulus /API /V1 supaya middleware kami hanya digunakan untuk bahagian API laman web kami. Jika laluan semasa sepadan dengan tajuk Jenis Kandungan Respons, tajuk Jenis Kandungan Respons terpaksa menjadi Aplikasi/JSON, dan saya periksa kaedah permintaan. Jika kaedah permintaan adalah salah satu kaedah permintaan yang membolehkan menulis (meletakkan, menyiarkan, patch), pengepala jenis kandungan permintaan mestilah permohonan/JSON, jika tidak, permohonan itu akan keluar dan memaparkan kod status HTTP jenis 415 yang tidak disokong. Jika semuanya berfungsi dengan baik, pernyataan $ this- & gt; next- & gt; call () akan menjalankan middleware seterusnya dalam rantai.

Pengesahan

Oleh kerana permohonan kami akan dijalankan pada HTTPS secara lalai, saya memutuskan untuk menggunakan kaedah di mana token mengambil keutamaan atas pengesahan asas: kekunci API dihantar ke medan nama pengguna header auth http asas (tiada kata laluan diperlukan)). Untuk melakukan ini, saya menulis kelas middleware yang tipis yang dipanggil Tokenoverbasicauth dengan mengubah suai httpbasicah yang sedia ada. Middleware ini berjalan pertama di dalam rantai, jadi ia ditambah sebagai yang terakhir, dan ia memerlukan parameter laluan akar pilihan dalam pembina.

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kaedah ini mencari Header Permintaan PHP_AUTH_USER untuk Token Auth, dan jika ia tidak wujud atau tidak sah, lulus 401 status dilarang dan tajuk pengesahan kepada pelanggan. Kaedah Verifikasi () dilindungi dan oleh itu boleh ditindih oleh subclass;

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
di sini, saya hanya menyemak kewujudan kunci API dalam jadual pengguna dan jika saya dapati pengguna yang sah, ia ditambah kepada konteks aplikasi untuk digunakan dengan lapisan seterusnya (Ratelimit). Anda boleh mengubah suai atau melanjutkan kelas ini untuk menyuntik logik pengesahan anda sendiri atau menggunakan modul OAuth. Untuk maklumat lanjut mengenai OAuth, lihat artikel Jamie Munro.

muatan ralat yang digunakan

API kami harus memaparkan mesej ralat yang berguna dalam format yang boleh digunakan, sebaik -baiknya dalam perwakilan JSON, jika boleh. Kami memerlukan muatan minimum yang mengandungi kod ralat dan mesej. Di samping itu, kesilapan pengesahan memerlukan lebih banyak segmentasi. Menggunakan Slim, kita boleh mentakrifkan semula 404 kesilapan dan kesilapan pelayan menggunakan kaedah $ App- & gt; notFound () dan $ App- & gt; (), masing-masing.

<code>URL             HTTP Method  Operation
/api/contacts   GET          返回联系人数组
/api/contacts/:id GET          返回 ID 为 :id 的联系人
/api/contacts   POST         添加一个新联系人并返回它(添加了 id 属性)
/api/contacts/:id PUT          更新 ID 为 :id 的联系人
/api/contacts/:id PATCH        部分更新 ID 为 :id 的联系人
/api/contacts/:id DELETE       删除 ID 为 :id 的联系人

/api/contacts/:id/star PUT    将 ID 为 :id 的联系人添加到收藏夹
/api/contacts/:id/star DELETE 从收藏夹中删除 ID 为 :id 的联系人

/api/contacts/:id/notes GET   返回 ID 为 :id 的联系人的笔记
/api/contacts/:id/notes/:nid GET   返回 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes POST  为 ID 为 :id 的联系人添加新笔记
/api/contacts/:id/notes/:nid PUT   更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid PATCH  部分更新 ID 为 :id 的联系人的 ID 为 :nid 的笔记
/api/contacts/:id/notes/:nid DELETE 删除 ID 为 :id 的联系人的 ID 为 :nid 的笔记</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ralat tidak dijumpai lebih mudah: Pertama saya mendapatkan jenis media yang diminta, dan kemudian bendera $ ISAPI memberitahu saya jika URL semasa berada di bawah kumpulan /API /V*. Jika pelanggan meminta URL API atau menghantar tajuk Jenis Kandungan JSON, saya akan mengembalikan output JSON, jika tidak, saya boleh membuat templat atau hanya mencetak beberapa HTML statik seperti yang ditunjukkan dalam contoh ini. Kesalahan lain agak rumit, dan kaedah $ App- & gt; () dicetuskan apabila pengecualian berlaku, dan Slim menukarkan ralat PHP standard ke objek ERRORException. Kami memerlukan satu cara untuk memberikan kesilapan yang berguna kepada pelanggan tanpa mendedahkan terlalu banyak mekanisme dalaman untuk mengelakkan kelemahan keselamatan. Untuk aplikasi ini, saya mencipta dua pengecualian adat, apiexception dan apiexceptionvalidationexception, yang terdedah kepada orang ramai, semua jenis pengecualian lain dilog masuk dalam log dan hanya dipaparkan dalam mod pembangunan.

{
  "name": "yourname/my-contacts",
  "description": "Simple RESTful API for contacts management",
  "license": "MIT",
  "authors": [
    {
      "name": "Your Name",
      "email": "you@yourdomain.com"
    }
  ],
  "require": {
    "slim/slim": "*",
    "slim/extras": "*",
    "slim/middleware": "*",
    "monolog/monolog": "*",
    "j4mie/paris": "*",
    "flynsarmy/slim-monolog": "*"
  },
  "archive": {
    "exclude": ["vendor", ".DS_Store", "*.log"]
  },
  "autoload": {
    "psr-0": {
      "API": "lib/"
    }
  }
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Kaedah

$ app- & gt; () menerima pengecualian yang dibuang sebagai parameter. Secara lalai saya mendapat semua data yang saya perlukan dan mengisi array ralat $, dan kemudian jika saya berada dalam mod pengeluaran, saya tidak dapat menyempurnakan data peribadi dan menulis semula mesej dengan data umum. Kelas ValidationException tersuai mempunyai kaedah getData () tersuai yang mengembalikan pelbagai ralat pengesahan yang ditambah kepada muatan akhir. Kemudian, paparkan ralat dalam JSON atau HTML berdasarkan permintaan. Di sisi API, kita boleh mempunyai ralat mudah seperti berikut:

<code>bootstrap.php
composer.json
README.md
bin/
    import
    install
lib/
    API/
public/
    .htaccess
    index.php
share/
    config/
        default.php
    db/
    logs/
    sql/
        data/
            contacts.sql
            users.sql
        tables/
            contacts.sql
            notes.sql
            users.sql
        ssl/
            mysitename.crt
            mysitename.key</code>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

atau ralat pengesahan lengkap seperti yang ditunjukkan di bawah:

<Directory>

  # Required for mod_rewrite in .htaccess
  AllowOverride FileInfo

  Options All -Indexes

  DirectoryIndex index.php index.shtml index.html

  <IfModule php5_module="">
    # For Development only!
    php_flag display_errors On
  </IfModule>

  # Enable gzip compression
  <IfModule filter_module="">
    AddOutputFilterByType DEFLATE application/json
  </IfModule>

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Directory>

<VirtualHost *:80>
  ServerAdmin you@yourdomain.com
  DocumentRoot "/path/to/MyApp/public"
  ServerName myapp.dev

  <IfModule rewrite_module="">
    RewriteEngine on

    ## Throw a 403 (forbidden) status for non secure requests
    RewriteCond %{HTTPS} off
    RewriteRule ^.*$ - [L,R=403]
  </IfModule>
</VirtualHost>

<IfModule ssl_module="">

  NameVirtualHost *:443

  Listen 443
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin

  <VirtualHost *:443>
    ServerAdmin you@yourdomain.com
    DocumentRoot "/path/to/MyApp/public"
    ServerName myapp.dev

    SSLEngine on
    SSLCertificateFile /path/to/MyApp/share/ssl/mysitename.crt
    SSLCertificateKeyFile /path/to/MyApp/share/ssl/mysitename.key

    SetEnv SLIM_MODE development

  </VirtualHost>
</IfModule>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kesimpulan

Kami kini mempunyai teras API. Dalam bahagian seterusnya, kami akan menambah beberapa kandungan untuk mempunyai perkhidmatan berfungsi sepenuhnya. Pada masa ini, jangan ragu untuk membaca artikel yang dikaitkan dalam bahagian ini - mereka adalah harta karun prinsip reka bentuk API yang berguna.

Soalan Lazim (FAQ) di bangunan API Rehat dari awal

Apakah komponen utama API REST?

REST API terdiri daripada beberapa komponen utama. Pertama ialah kaedah HTTP, yang mentakrifkan jenis operasi yang akan dilakukan. Ini termasuk mendapatkan, pos, meletakkan, memadam, dll. Komponen kedua adalah URL atau URI, yang merupakan pengenal sumber. Komponen ketiga adalah header HTTP, yang membawa metadata permintaan dan respons HTTP. Komponen keempat adalah badan atau muatan, yang membawa data sebenar dihantar. Akhirnya, kod status menunjukkan kejayaan atau kegagalan permintaan HTTP.

bagaimana melindungi API REST saya?

Melindungi API REST anda adalah penting untuk melindungi data sensitif. Anda boleh menggunakan pelbagai kaedah seperti kekunci API, OAuth, atau JWT untuk pengesahan dan kebenaran. Di samping itu, pemindahan data sentiasa digunakan untuk memastikan integriti data dan kerahsiaan. Secara kerap mengemas kini dan tampalkan API anda dan kebergantungannya untuk melindungi daripada kelemahan.

bagaimana versi API REST saya?

Versi API REST anda membolehkan anda memperkenalkan perubahan yang tidak merosakkan tanpa menjejaskan pelanggan sedia ada. Anda boleh versi API dengan memasukkan nombor versi dalam URL atau menggunakan tajuk permintaan tersuai. Ingatlah untuk log semua perubahan dan beritahu pengguna API anda tentang versi baru dan ciri -ciri mereka.

Bagaimana menangani kesilapan dalam API REST?

Pengendalian ralat yang betul dalam API REST meningkatkan kebolehgunaan dan kebolehpercayaannya. Gunakan kod status HTTP untuk menunjukkan jenis ralat. Sertakan mesej ralat dalam badan tindak balas untuk maklumat lanjut mengenai ralat. Ini membantu pelanggan memahami apa yang salah dan bagaimana menyelesaikan masalah.

Bagaimana untuk menguji API REST saya?

Uji API REST anda untuk memastikan ia berfungsi seperti yang diharapkan dan boleh mengendalikan pelbagai senario. Anda boleh menggunakan alat seperti Postman atau Curl untuk ujian manual. Untuk ujian automatik, pertimbangkan untuk menggunakan ujian unit, ujian integrasi, dan ujian akhir-ke-akhir. Gunakan pelayan mock untuk mensimulasikan tindak balas API dan menguji bagaimana API anda mengendalikan pelbagai jenis respons.

Bagaimana untuk merakam API REST saya?

Dokumentasi yang baik menjadikan API REST anda mudah difahami dan digunakan. Termasuk maklumat terperinci mengenai titik akhir, kaedah permintaan, parameter permintaan, contoh permintaan, kod status tindak balas, dan contoh tindak balas. Anda boleh menggunakan alat seperti Swagger atau Postman untuk menjana dan menjadi tuan rumah dokumen API anda.

bagaimana merancang API yang tenang?

Reka bentuk API Restful melibatkan sumber perancangan, titik akhir, dan kaedah. Gunakan kata nama untuk sumber dan kaedah HTTP untuk operasi. Pastikan API mudah dan intuitif. Gunakan kod status untuk menunjukkan hasil permintaan. Buat API anda tanpa statistik, yang bermaksud bahawa setiap permintaan harus mengandungi semua maklumat yang anda perlukan untuk memproses permintaan tersebut.

bagaimana untuk menuding hasil dalam API REST saya?

paging membantu mengehadkan jumlah data yang dikembalikan dalam satu tindak balas. Anda boleh melaksanakan paging menggunakan parameter pertanyaan seperti "halaman" dan "had". Sertakan metadata dalam tajuk atau badan tindak balas untuk menunjukkan halaman semasa, jumlah halaman, jumlah item, dll.

Bagaimana untuk mengehadkan kadar API REST saya?

Kadar had melindungi API REST anda dari penyalahgunaan dan memastikan penggunaan yang adil. Anda boleh mengehadkan bilangan permintaan berdasarkan alamat IP, kunci API, atau akaun pengguna anda. Gunakan tajuk HTTP untuk menyampaikan status pembatas kadar kepada pelanggan.

bagaimana menggunakan API REST saya?

Anda boleh menggunakan API REST anda ke pelayan atau platform awan. Apabila memilih pilihan penempatan, pertimbangkan faktor seperti kos, skalabiliti, dan keselamatan. Gunakan alat integrasi berterusan dan penghantaran berterusan (CI/CD) untuk mengautomasikan proses penempatan. Pantau prestasi dan penggunaan API anda untuk memastikan ia memenuhi keperluan pengguna anda.

Atas ialah kandungan terperinci Bina API rehat dari awal: Pengenalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan