

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Minta validasi untuk REST APIs di API Gateway
<a name="api-gateway-method-request-validation"></a>

 Anda dapat mengonfigurasi API Gateway untuk melakukan validasi dasar permintaan API sebelum melanjutkan dengan permintaan integrasi. Ketika validasi gagal, API Gateway segera gagal permintaan, mengembalikan respons kesalahan 400 ke pemanggil, dan menerbitkan hasil validasi di Log. CloudWatch Ini mengurangi panggilan yang tidak perlu ke backend. Lebih penting lagi, ini memungkinkan Anda fokus pada upaya validasi khusus untuk aplikasi Anda. Anda dapat memvalidasi badan permintaan dengan memverifikasi bahwa parameter permintaan yang diperlukan valid dan non-null atau dengan menentukan skema model untuk validasi data yang lebih rumit.

**Topics**
+ [Ikhtisar validasi permintaan dasar di API Gateway](#api-gateway-request-validation-basic-definitions)
+ [Model data untuk REST APIs](models-mappings-models.md)
+ [Siapkan validasi permintaan dasar di API Gateway](api-gateway-request-validation-set-up.md)
+ [AWS CloudFormation template API sampel dengan validasi permintaan dasar](api-gateway-request-validation-sample-cloudformation.md)

## Ikhtisar validasi permintaan dasar di API Gateway
<a name="api-gateway-request-validation-basic-definitions"></a>

 API Gateway dapat melakukan validasi permintaan dasar, sehingga Anda dapat fokus pada validasi khusus aplikasi di backend. Untuk validasi, API Gateway memverifikasi salah satu atau kedua kondisi berikut: 
+ Parameter permintaan yang diperlukan dalam URI, string kueri, dan header permintaan masuk disertakan dan tidak kosong. API Gateway hanya memeriksa keberadaan parameter dan tidak memeriksa jenis atau formatnya.
+  Payload permintaan yang berlaku mematuhi permintaan [skema JSON](https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04) yang dikonfigurasi dari metode untuk jenis konten tertentu. Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, setel tipe konten untuk model data Anda`$default`.

Untuk mengaktifkan validasi, Anda menentukan aturan validasi dalam validator [permintaan, menambahkan validator](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html) ke [peta API validator permintaan, dan menetapkan validator](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html) ke metode API individual. 

**catatan**  
Minta validasi badan dan [Perilaku permintaan metode untuk muatan tanpa memetakan template untuk REST APIs di API Gateway](integration-passthrough-behaviors.md) merupakan dua topik terpisah. Jika payload permintaan tidak memiliki skema model yang cocok, Anda dapat memilih untuk melewati atau memblokir muatan asli. Untuk informasi selengkapnya, lihat [Perilaku permintaan metode untuk muatan tanpa memetakan template untuk REST APIs di API Gateway](integration-passthrough-behaviors.md).

# Model data untuk REST APIs
<a name="models-mappings-models"></a>

Di API Gateway, model mendefinisikan struktur data payload. Di API Gateway, model didefinisikan menggunakan [draf skema JSON](https://tools.ietf.org/html/draft-zyp-json-schema-04) 4. Objek JSON berikut adalah data sampel dalam contoh Pet Store.

```
{
    "id": 1,
    "type": "dog",
    "price": 249.99
}
```

Data berisi`id`,`type`, dan `price` hewan peliharaan. Model data ini memungkinkan Anda untuk:
+ Gunakan validasi permintaan dasar.
+ Buat template pemetaan untuk transformasi data.
+ Buat tipe data yang ditentukan pengguna (UDT) saat Anda membuat SDK.

![\[Contoh model data JSON untuk PetStore API.\]](http://docs.aws.amazon.com/id_id/apigateway/latest/developerguide/images/how-to-validate-requests.png)


Dalam model ini:

1. `$schema`Objek mewakili pengidentifikasi versi Skema JSON yang valid. Skema ini adalah draf Skema JSON v4.

1. `title`Objek adalah pengidentifikasi yang dapat dibaca manusia untuk model tersebut. Judul ini adalah`PetStoreModel`.

1.  Kata kunci `required` validasi membutuhkan`type`, dan `price` untuk validasi permintaan dasar.

1. Model `properties` tersebut adalah`id`,`type`, dan`price`. Setiap objek memiliki properti yang dijelaskan dalam model.

1. Objek hanya `type` dapat memiliki nilai`dog`,`cat`, atau`fish`.

1. Objek `price` adalah angka dan dibatasi dengan `minimum` 25 dan 500`maximum`.

## PetStore model
<a name="PetStore-model-text"></a>

```
1 {
2 "$schema": "http://json-schema.org/draft-04/schema#",
3  "title": "PetStoreModel",
4  "type" : "object",
5  "required" : [ "price", "type" ],
6  "properties" : {
7    "id" : {
8      "type" : "integer"
9    },
10    "type" : {
11      "type" : "string",
12      "enum" : [ "dog", "cat", "fish" ]
13    },
14    "price" : {
15      "type" : "number",
16      "minimum" : 25.0,
17      "maximum" : 500.0
18    }
19  }
20 }
```

Dalam model ini:

1. Pada baris 2, `$schema` objek mewakili pengenal versi Skema JSON yang valid. Skema ini adalah draf Skema JSON v4.

1. Pada baris 3, `title` objek adalah pengidentifikasi yang dapat dibaca manusia untuk model tersebut. Judul ini adalah`PetStoreModel`.

1.  Pada baris 5, kata kunci `required` validasi membutuhkan`type`, dan `price` untuk validasi permintaan dasar.

1.  Pada baris 6 - 17, modelnya adalah`id`,`type`, dan`price`. `properties` Setiap objek memiliki properti yang dijelaskan dalam model.

1. Pada baris 12, objek hanya `type` dapat memiliki nilai`dog`,`cat`, atau`fish`.

1. Pada baris 14 - 17, objek `price` adalah angka dan dibatasi dengan `minimum` 25 dan 500`maximum`.

## Membuat model yang lebih kompleks
<a name="api-gateway-request-validation-model-more-complex"></a>

 Anda dapat menggunakan `$ref` primitif untuk membuat definisi yang dapat digunakan kembali untuk model yang lebih panjang. Misalnya, Anda dapat membuat definisi yang disebut `Price` di `definitions` bagian yang menjelaskan `price` objek. Nilai `$ref` adalah `Price` definisi. 

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStoreModelReUsableRef",
  "required" : ["price", "type" ],
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "dog", "cat", "fish" ]
    },
    "price" : {
        "$ref": "#/definitions/Price"
    }
  },
  "definitions" : {
      "Price": {
        "type" : "number",
        "minimum" : 25.0,
        "maximum" : 500.0
            }
      }
}
```

Anda juga dapat mereferensikan skema model lain yang ditentukan dalam file model eksternal. Tetapkan nilai `$ref` properti ke lokasi model. Dalam contoh berikut, `Price` model didefinisikan dalam `PetStorePrice` model di API`a1234`.

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStorePrice",
  "type": "number",
  "minimum": 25,
  "maximum": 500
}
```

Model yang lebih panjang dapat merujuk `PetStorePrice` model.

```
{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "PetStoreModelReusableRefAPI",
  "required" : [ "price", "type" ],
  "type" : "object",
  "properties" : {
    "id" : {
      "type" : "integer"
    },
    "type" : {
      "type" : "string",
      "enum" : [ "dog", "cat", "fish" ]
    },
    "price" : {
        "$ref": "https://apigateway.amazonaws.com/restapis/a1234/models/PetStorePrice"
    }
  }
}
```

## Menggunakan model data keluaran
<a name="api-gateway-request-validation-output-model"></a>

Jika Anda mengubah data, Anda dapat menentukan model payload dalam respons integrasi. Model payload dapat digunakan saat Anda membuat SDK. Untuk bahasa yang diketik dengan kuat, seperti Java, Objective-C, atau Swift, objek sesuai dengan tipe data yang ditentukan pengguna (UDT). API Gateway membuat UDT jika Anda menyediakannya dengan model data saat Anda membuat SDK. Untuk informasi selengkapnya tentang transformasi data, lihat[Memetakan transformasi template untuk REST APIs di API Gateway](models-mappings.md).

Contoh berikut adalah data keluaran dari respons integrasi.

```
{
[
  {
    "description" : "Item 1 is a dog.",
    "askingPrice" : 249.99
  },
  {
    "description" : "Item 2 is a cat.",
    "askingPrice" : 124.99
  },
  {
    "description" : "Item 3 is a fish.",
    "askingPrice" : 0.99
  }
]
}
```

Contoh berikut adalah model payload yang menggambarkan data output.

```
{
"$schema": "http://json-schema.org/draft-04/schema#",
  "title": "PetStoreOutputModel",
  "type" : "object",
  "required" : [ "description", "askingPrice" ],
  "properties" : {
    "description" : {
      "type" : "string"
    },
    "askingPrice" : {
      "type" : "number",
      "minimum" : 25.0,
      "maximum" : 500.0
    }
  }
}
```

Dengan model ini, Anda dapat memanggil SDK untuk mengambil nilai `description` dan `askingPrice` properti dengan membaca properti `PetStoreOutputModel[i].description` dan`PetStoreOutputModel[i].askingPrice`. Jika tidak ada model yang disediakan, API Gateway menggunakan model kosong untuk membuat UDT default. 

## Langkah selanjutnya
<a name="api-gateway-request-validation-model-next-steps"></a>
+ Bagian ini menyediakan sumber daya yang dapat Anda gunakan untuk mendapatkan lebih banyak pengetahuan tentang konsep yang disajikan dalam topik ini.

  Anda dapat mengikuti tutorial validasi permintaan:
  + [Siapkan validasi permintaan menggunakan konsol API Gateway](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-in-console)
  +  [Siapkan validasi permintaan dasar menggunakan AWS CLI](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-cli)
  +  [Siapkan validasi permintaan dasar menggunakan definisi OpenAPI](api-gateway-request-validation-set-up.md#api-gateway-request-validation-setup-importing-swagger)
+  Untuk informasi selengkapnya tentang templat transformasi dan pemetaan data, [Memetakan transformasi template untuk REST APIs di API Gateway](models-mappings.md)

# Siapkan validasi permintaan dasar di API Gateway
<a name="api-gateway-request-validation-set-up"></a>

 Bagian ini menunjukkan cara menyiapkan validasi permintaan untuk API Gateway menggunakan konsol AWS CLI, dan definisi OpenAPI.

**Topics**
+ [Siapkan validasi permintaan menggunakan konsol API Gateway](#api-gateway-request-validation-setup-in-console)
+ [Siapkan validasi permintaan dasar menggunakan AWS CLI](#api-gateway-request-validation-setup-cli)
+ [Siapkan validasi permintaan dasar menggunakan definisi OpenAPI](#api-gateway-request-validation-setup-importing-swagger)

## Siapkan validasi permintaan menggunakan konsol API Gateway
<a name="api-gateway-request-validation-setup-in-console"></a>

 Anda dapat menggunakan konsol API Gateway untuk memvalidasi permintaan dengan memilih salah satu dari tiga validator untuk permintaan API: 
+ **Validasi tubuh**.
+ **Validasi parameter string kueri dan header**.
+ **Validasi isi, parameter string kueri, dan header**.

 Saat Anda menerapkan salah satu validator pada metode API, konsol API Gateway menambahkan validator ke peta API. [RequestValidators](https://docs.aws.amazon.com/apigateway/latest/api/API_RequestValidator.html)

Untuk mengikuti tutorial ini, Anda akan menggunakan CloudFormation template untuk membuat API Gateway API yang tidak lengkap. API ini memiliki `/validator` sumber daya dengan `GET` dan `POST` metode. Kedua metode terintegrasi dengan titik akhir `http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP. Anda akan mengkonfigurasi dua jenis validasi permintaan:
+ Dalam `GET` metode ini, Anda akan mengkonfigurasi validasi permintaan untuk parameter string kueri URL.
+ Dalam `POST` metode ini, Anda akan mengonfigurasi validasi permintaan untuk badan permintaan.

 Ini akan memungkinkan hanya panggilan API tertentu untuk melewati API. 

Unduh dan unzip [template pembuatan aplikasi untuk CloudFormation](samples/request-validation-tutorial-console.zip). Anda akan menggunakan template ini untuk membuat API yang tidak lengkap. Anda akan menyelesaikan langkah-langkah lainnya di konsol API Gateway. 

**Untuk membuat CloudFormation tumpukan**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pilih **Buat tumpukan** kemudian pilih **Dengan sumber daya baru (standar)**.

1. Untuk **Tentukan templat**, pilih **Unggah file templat**.

1. Pilih template yang Anda unduh.

1. Pilih **Berikutnya**. 

1. Untuk **nama Stack**, masukkan **request-validation-tutorial-console** dan kemudian pilih **Berikutnya**.

1. Untuk **opsi Konfigurasi tumpukan**, pilih **Berikutnya**.

1. Untuk **Kemampuan**, akui bahwa CloudFormation dapat membuat sumber daya IAM di akun Anda.

1. Pilih **Berikutnya**, lalu pilih **Kirim**.

CloudFormation ketentuan sumber daya yang ditentukan dalam template. Diperlukan beberapa menit untuk menyelesaikan penyediaan sumber daya Anda. Ketika status CloudFormation tumpukan Anda adalah **CREATE\$1COMPLETE**, Anda siap untuk melanjutkan ke langkah berikutnya.

**Untuk memilih API yang baru dibuat**

1. Pilih **request-validation-tutorial-console** tumpukan yang baru dibuat.

1. Pilih **Sumber daya**.

1. Di bawah **Physical ID**, pilih API Anda. Tautan ini akan mengarahkan Anda ke konsol API Gateway.

Sebelum Anda memodifikasi `GET` dan `POST` metode, Anda harus membuat model.

**Untuk membuat model**

1. Model diperlukan untuk menggunakan validasi permintaan pada badan permintaan yang masuk. Untuk membuat model, di panel navigasi utama, pilih **Model**.

1. Pilih **Buat model**.

1. Untuk **Nama**, masukkan **PetStoreModel**.

1. Untuk **Jenis Konten**, masukkan**application/json**. Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan**\$1default**.

1. Untuk **Deskripsi**, masukkan **My PetStore Model** sebagai deskripsi model.

1. Untuk **skema Model**, tempelkan model berikut ke editor kode, dan pilih **Buat**. 

   ```
   {
     "type" : "object",
     "required" : [ "name", "price", "type" ],
     "properties" : {
       "id" : {
         "type" : "integer"
       },
       "type" : {
         "type" : "string",
         "enum" : [ "dog", "cat", "fish" ]
       },
       "name" : {
         "type" : "string"
       },
       "price" : {
         "type" : "number",
         "minimum" : 25.0,
         "maximum" : 500.0
       }
     }
   }
   ```

Untuk informasi lebih lanjut tentang model, lihat[Model data untuk REST APIs](models-mappings-models.md). 

**Untuk mengkonfigurasi validasi permintaan untuk metode `GET`**

1. Di panel navigasi utama, pilih **Resources**, lalu pilih metode **GET**. 

1. Pada tab **Permintaan metode**, di bawah **Pengaturan permintaan metode**, pilih **Edit**.

1. Untuk **validator Permintaan**, pilih **Validasi parameter string kueri** dan header.

1. Di bawah **parameter string kueri URL**, lakukan hal berikut: 

   1. Pilih **Tambahkan string kueri**.

   1. Untuk **Nama**, masukkan **petType**.

   1. Aktifkan **Diperlukan**.

   1. Tetap **caching** dimatikan. 

1. Pilih **Simpan**.

1. Pada tab **Permintaan integrasi**, di bawah **Pengaturan permintaan integrasi**, pilih **Edit**.

1. Di bawah **parameter string kueri URL**, lakukan hal berikut: 

   1. Pilih **Tambahkan string kueri**.

   1. Untuk **Nama**, masukkan **petType**.

   1. Untuk **Dipetakan dari**, masukkan**method.request.querystring.petType**. Ini memetakan **petType** ke jenis hewan peliharaan.

      Untuk informasi selengkapnya tentang pemetaan data, lihat tutorial [pemetaan data](set-up-data-transformations-in-api-gateway.md#mapping-example-console).

   1. Tetap **caching** dimatikan. 

1. Pilih **Simpan**.

**Untuk menguji validasi permintaan untuk metode ini `GET`**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **string Kueri**, masukkan**petType=dog**, lalu pilih **Uji**.

1. Tes metode akan kembali `200 OK` dan daftar anjing-anjingnya.

   Untuk informasi tentang cara mengubah data keluaran ini, lihat [tutorial pemetaan data](set-up-data-transformations-in-api-gateway.md#mapping-example-console).

1. Hapus **petType=dog** dan pilih **Uji**. 

1.  Tes metode akan mengembalikan `400` kesalahan dengan pesan kesalahan berikut: 

   ```
   {
     "message": "Missing required request parameters: [petType]"
   }
   ```

**Untuk mengkonfigurasi validasi permintaan untuk metode `POST`**

1. Di panel navigasi utama, pilih **Resources**, lalu pilih metode **POST**. 

1. Pada tab **Permintaan metode**, di bawah **Pengaturan permintaan metode**, pilih **Edit**.

1. Untuk **validator Permintaan**, pilih **Validasi** isi.

1. Di bawah **badan Permintaan**, pilih **Tambah model**.

1. Untuk **jenis Konten**, masukkan**application/json**. Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, masukkan`$default`.

    Untuk **Model**, pilih **PetStoreModel**.

1. Pilih **Simpan**.

**Untuk menguji validasi permintaan untuk metode `POST`**

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Untuk **Request body** paste berikut ini ke editor kode:

   ```
   {
     "id": 2,
     "name": "Bella",
     "type": "dog",
     "price": 400
   }
   ```

    Pilih **Uji**.

1. Tes metode akan kembali `200 OK` dan pesan sukses. 

1. Untuk **Request body** paste berikut ini ke editor kode:

   ```
   {
     "id": 2,
     "name": "Bella",
     "type": "dog",
     "price": 4000
   }
   ```

    Pilih **Uji**. 

1.  Tes metode akan mengembalikan `400` kesalahan dengan pesan kesalahan berikut:

   ```
   {
    "message": "Invalid request body"
   }
   ```

    Di bagian bawah log pengujian, alasan untuk badan permintaan yang tidak valid dikembalikan. Dalam hal ini, harga hewan peliharaan berada di luar maksimum yang ditentukan dalam model. 

**Untuk menghapus CloudFormation tumpukan**

1. Buka CloudFormation konsol di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Pilih CloudFormation tumpukan Anda.

1. Pilih **Hapus** dan kemudian konfirmasikan pilihan Anda.

### Langkah selanjutnya
<a name="next-steps-request-validation-tutorial"></a>
+ Untuk informasi tentang cara mengubah data keluaran dan melakukan lebih banyak pemetaan data, lihat tutorial [pemetaan data](set-up-data-transformations-in-api-gateway.md#mapping-example-console).
+ Ikuti [Mengatur validasi permintaan dasar menggunakan AWS CLI](#api-gateway-request-validation-setup-cli) tutorial, untuk melakukan langkah-langkah serupa menggunakan. AWS CLI

## Siapkan validasi permintaan dasar menggunakan AWS CLI
<a name="api-gateway-request-validation-setup-cli"></a>

Anda dapat membuat validator untuk menyiapkan validasi permintaan menggunakan. AWS CLI Untuk mengikuti tutorial ini, Anda akan menggunakan CloudFormation template untuk membuat API Gateway API yang tidak lengkap. 

**catatan**  
Ini bukan CloudFormation template yang sama dengan tutorial konsol.

 Menggunakan `/validator` sumber daya pra-ekspos, Anda akan membuat `GET` dan `POST` metode. Kedua metode akan terintegrasi dengan titik akhir `http://petstore-demo-endpoint.execute-api.com/petstore/pets` HTTP. Anda akan mengkonfigurasi dua validasi permintaan berikut:
+ Pada `GET` metode ini, Anda akan membuat `params-only` validator untuk memvalidasi parameter string kueri URL.
+ Pada `POST` metode ini, Anda akan membuat `body-only` validator untuk memvalidasi badan permintaan.

 Ini akan memungkinkan hanya panggilan API tertentu untuk melewati API. 

**Untuk membuat CloudFormation tumpukan**

Unduh dan unzip [template pembuatan aplikasi untuk CloudFormation](samples/request-validation-tutorial-cli.zip). 

Untuk menyelesaikan tutorial berikut, Anda memerlukan [AWS Command Line Interface (AWS CLI) versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). 

Untuk perintah panjang, karakter escape (`\`) digunakan untuk memisahkan perintah menjadi beberapa baris.
**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://learn.microsoft.com/en-us/windows/wsl/install) Linux. Contoh perintah CLI dalam panduan ini menggunakan pemformatan Linux. Perintah yang menyertakan dokumen JSON sebaris harus diformat ulang jika Anda menggunakan CLI Windows. 

1.  Gunakan perintah berikut untuk membuat CloudFormation tumpukan.

   ```
   aws cloudformation create-stack --stack-name request-validation-tutorial-cli --template-body file://request-validation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM 
   ```

1. CloudFormation ketentuan sumber daya yang ditentukan dalam template. Diperlukan beberapa menit untuk menyelesaikan penyediaan sumber daya Anda. Gunakan perintah berikut untuk melihat status CloudFormation tumpukan Anda.

   ```
   aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli
   ```

1. Ketika status CloudFormation tumpukan Anda`StackStatus: "CREATE_COMPLETE"`, gunakan perintah berikut untuk mengambil nilai output yang relevan untuk langkah-langkah masa depan.

   ```
    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"
   ```

   Nilai output adalah sebagai berikut:
   + ApiId, yang merupakan ID untuk API. Untuk tutorial ini, ID API adalah`abc123`.
   + ResourceId, yang merupakan ID untuk sumber daya validator tempat `GET` dan `POST` metode diekspos. Untuk tutorial ini, ID Sumber Daya adalah `efg456`

**Untuk membuat validator permintaan dan mengimpor model**

1. Validator diperlukan untuk menggunakan validasi permintaan dengan file. AWS CLI Gunakan perintah berikut untuk membuat validator yang hanya memvalidasi parameter permintaan. 

   ```
   aws apigateway create-request-validator --rest-api-id abc123 \
         --no-validate-request-body \
         --validate-request-parameters \
         --name params-only
   ```

   Perhatikan ID `params-only` validator.

1.  Gunakan perintah berikut untuk membuat validator yang hanya memvalidasi badan permintaan. 

   ```
   aws apigateway create-request-validator --rest-api-id abc123 \
         --validate-request-body \
         --no-validate-request-parameters \
         --name body-only
   ```

   Perhatikan ID `body-only` validator.

1.  Model diperlukan untuk menggunakan validasi permintaan pada badan permintaan yang masuk. Gunakan perintah berikut untuk mengimpor model.

   ```
   aws apigateway create-model --rest-api-id abc123 --name PetStoreModel --description 'My PetStore Model' --content-type 'application/json' --schema '{"type": "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : {"type" : "integer"},"type" : {"type" : "string", "enum" : [ "dog", "cat", "fish" ]},"name" : { "type" : "string"},"price" : {"type" : "number","minimum" : 25.0, "maximum" : 500.0}}}}' 
   ```

   Jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, tentukan `$default` sebagai kunci.

**Untuk membuat `GET` dan `POST` metode**

1. Gunakan perintah berikut untuk menambahkan metode `GET` HTTP pada `/validate` sumber daya. Perintah ini menciptakan `GET` metode, menambahkan `params-only` validator, dan menetapkan string query `petType` sesuai kebutuhan. 

   ```
   aws apigateway put-method --rest-api-id abc123 \
          --resource-id efg456 \
          --http-method GET \
          --authorization-type "NONE" \
          --request-validator-id aaa111 \
          --request-parameters "method.request.querystring.petType=true"
   ```

   Gunakan perintah berikut untuk menambahkan metode `POST` HTTP pada `/validate` sumber daya. Perintah ini membuat `POST` metode, menambahkan `body-only` validator, dan melampirkan model ke validator body-only. 

   ```
   aws apigateway put-method --rest-api-id abc123 \
          --resource-id efg456 \
          --http-method POST \
          --authorization-type "NONE" \
          --request-validator-id bbb222 \
          --request-models 'application/json'=PetStoreModel
   ```

1.  Gunakan perintah berikut untuk mengatur `200 OK` respons `GET /validate` metode. 

   ```
   aws apigateway put-method-response --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method GET \
               --status-code 200
   ```

    Gunakan perintah berikut untuk mengatur `200 OK` respons `POST /validate` metode.

   ```
   aws apigateway put-method-response --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method POST \
               --status-code 200
   ```

1.  Gunakan perintah berikut untuk mengatur `Integration` dengan titik akhir HTTP tertentu untuk `GET /validation` metode ini. 

   ```
   aws apigateway put-integration --rest-api-id abc123  \
               --resource-id efg456 \
               --http-method GET \
               --type HTTP \
               --integration-http-method GET \
               --request-parameters '{"integration.request.querystring.type" : "method.request.querystring.petType"}' \
               --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   ```

    Gunakan perintah berikut untuk mengatur `Integration` dengan titik akhir HTTP tertentu untuk `POST /validation` metode ini. 

   ```
   aws apigateway put-integration --rest-api-id abc123  \
                 --resource-id efg456 \
                 --http-method POST \
                 --type HTTP \
                 --integration-http-method GET \
                 --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   ```

1.  Gunakan perintah berikut untuk menyiapkan respons integrasi untuk `GET /validation` metode ini. 

   ```
   aws apigateway put-integration-response --rest-api-id abc123 \
                 --resource-id efg456\
                 --http-method GET \
                 --status-code 200 \
                 --selection-pattern ""
   ```

    Gunakan perintah berikut untuk menyiapkan respons integrasi untuk `POST /validation` metode ini.

   ```
   aws apigateway put-integration-response --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method POST \
               --status-code 200 \
               --selection-pattern ""
   ```

**Untuk menguji API**

1. Untuk menguji `GET` metode, yang akan melakukan validasi permintaan untuk string query, gunakan perintah berikut:

   ```
   aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method GET \
               --path-with-query-string '/validate?petType=dog'
   ```

   Hasilnya akan mengembalikan daftar `200 OK` dan anjing-anjingnya.

1. Gunakan perintah berikut untuk menguji tanpa menyertakan string kueri `petType`

   ```
   aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method GET
   ```

   Hasilnya akan mengembalikan `400` kesalahan.

1. Untuk menguji `POST` metode, yang akan melakukan validasi permintaan untuk badan permintaan, gunakan perintah berikut:

   ```
    aws apigateway test-invoke-method --rest-api-id abc123 \
               --resource-id efg456 \
               --http-method POST \
               --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'
   ```

   Hasilnya akan mengembalikan pesan `200 OK` dan sukses. 

1. Gunakan perintah berikut untuk menguji menggunakan badan yang tidak valid.

   ```
    aws apigateway test-invoke-method --rest-api-id abc123 \
                 --resource-id efg456 \
                 --http-method POST \
                 --body '{"id": 1, "name": "bella", "type": "dog", "price" : 1000 }'
   ```

   Hasilnya akan mengembalikan `400` kesalahan, karena harga anjingnya melebihi harga maksimum yang ditentukan oleh model.

**Untuk menghapus CloudFormation tumpukan**
+ Gunakan perintah berikut untuk menghapus CloudFormation sumber daya Anda.

  ```
  aws cloudformation delete-stack  --stack-name request-validation-tutorial-cli
  ```

## Siapkan validasi permintaan dasar menggunakan definisi OpenAPI
<a name="api-gateway-request-validation-setup-importing-swagger"></a>

 Anda dapat mendeklarasikan validator permintaan di API level dengan menentukan satu set [x-amazon-apigateway-request-Validators.requestValidator objek](api-gateway-swagger-extensions-request-validators.requestValidator.md) objek di [x-amazon-apigateway-request-validator objek](api-gateway-swagger-extensions-request-validators.md) peta untuk memilih bagian permintaan mana yang akan divalidasi. Dalam definisi OpenAPI contoh, ada dua validator: 
+ `all`validator yang memvalidasi tubuh, menggunakan model `RequestBodyModel` data, dan parameter.

  Model `RequestBodyModel` data mengharuskan objek input JSON berisi`name`,`type`, dan `price` properti. `name`Properti dapat berupa string apa pun, `type` harus menjadi salah satu bidang enumerasi yang ditentukan (`["dog", "cat", "fish"]`), dan `price` harus berkisar antara 25 dan 500. `id`Parameter tidak diperlukan. 
+ `param-only`yang hanya memvalidasi parameter.

 Untuk mengaktifkan validator permintaan pada semua metode API, tentukan [x-amazon-apigateway-requestproperti -validator](api-gateway-swagger-extensions-request-validator.md) properti di tingkat API definisi OpenAPI. Dalam definisi OpenAPI contoh, `all` validator digunakan pada semua metode API, kecuali jika diganti. Saat menggunakan model untuk memvalidasi isi, jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, tentukan `$default` sebagai kunci.

Untuk mengaktifkan validator permintaan pada metode individual, tentukan `x-amazon-apigateway-request-validator` properti di tingkat metode. Dalam contoh, definisi OpenAPI, `param-only` validator menimpa validator pada metode. `all` `GET`



Untuk mengimpor contoh OpenAPI ke API Gateway, lihat petunjuk berikut ke [Impor API Regional ke API Gateway](import-export-api-endpoints.md) atau ke. [Impor API yang dioptimalkan tepi ke API Gateway](import-edge-optimized-api.md)

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "ReqValidators Sample",
    "version" : "1.0.0"
  },
  "servers" : [ {
    "url" : "/{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "/v1"
      }
    }
  } ],
  "paths" : {
    "/validation" : {
      "get" : {
        "parameters" : [ {
          "name" : "q1",
          "in" : "query",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "headers" : {
              "test-method-response-header" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ArrayOfError"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "params-only",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.querystring.type" : "method.request.querystring.q1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      },
      "post" : {
        "parameters" : [ {
          "name" : "h1",
          "in" : "header",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/RequestBodyModel"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "200 response",
            "headers" : {
              "test-method-response-header" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/ArrayOfError"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "all",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "POST",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.custom_h1" : "method.request.header.h1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "RequestBodyModel" : {
        "required" : [ "name", "price", "type" ],
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "integer"
          },
          "type" : {
            "type" : "string",
            "enum" : [ "dog", "cat", "fish" ]
          },
          "name" : {
            "type" : "string"
          },
          "price" : {
            "maximum" : 500.0,
            "minimum" : 25.0,
            "type" : "number"
          }
        }
      },
      "ArrayOfError" : {
        "type" : "array",
        "items" : {
          "$ref" : "#/components/schemas/Error"
        }
      },
      "Error" : {
        "type" : "object"
      }
    }
  },
  "x-amazon-apigateway-request-validators" : {
    "all" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : true
    },
    "params-only" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : false
    }
  }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger" : "2.0",
  "info" : {
    "version" : "1.0.0",
    "title" : "ReqValidators Sample"
  },
  "basePath" : "/v1",
  "schemes" : [ "https" ],
  "paths" : {
    "/validation" : {
      "get" : {
        "produces" : [ "application/json", "application/xml" ],
        "parameters" : [ {
          "name" : "q1",
          "in" : "query",
          "required" : true,
          "type" : "string"
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "schema" : {
              "$ref" : "#/definitions/ArrayOfError"
            },
            "headers" : {
              "test-method-response-header" : {
                "type" : "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "params-only",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.querystring.type" : "method.request.querystring.q1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      },
      "post" : {
        "consumes" : [ "application/json" ],
        "produces" : [ "application/json", "application/xml" ],
        "parameters" : [ {
          "name" : "h1",
          "in" : "header",
          "required" : true,
          "type" : "string"
        }, {
          "in" : "body",
          "name" : "RequestBodyModel",
          "required" : true,
          "schema" : {
            "$ref" : "#/definitions/RequestBodyModel"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "schema" : {
              "$ref" : "#/definitions/ArrayOfError"
            },
            "headers" : {
              "test-method-response-header" : {
                "type" : "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator" : "all",
        "x-amazon-apigateway-integration" : {
          "httpMethod" : "POST",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "400",
              "responseParameters" : {
                "method.response.header.test-method-response-header" : "'static value'"
              },
              "responseTemplates" : {
                "application/xml" : "xml 400 response template",
                "application/json" : "json 400 response template"
              }
            },
            "2\\d{2}" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.header.custom_h1" : "method.request.header.h1"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "http"
        }
      }
    }
  },
  "definitions" : {
    "RequestBodyModel" : {
      "type" : "object",
      "required" : [ "name", "price", "type" ],
      "properties" : {
        "id" : {
          "type" : "integer"
        },
        "type" : {
          "type" : "string",
          "enum" : [ "dog", "cat", "fish" ]
        },
        "name" : {
          "type" : "string"
        },
        "price" : {
          "type" : "number",
          "minimum" : 25.0,
          "maximum" : 500.0
        }
      }
    },
    "ArrayOfError" : {
      "type" : "array",
      "items" : {
        "$ref" : "#/definitions/Error"
      }
    },
    "Error" : {
      "type" : "object"
    }
  },
  "x-amazon-apigateway-request-validators" : {
    "all" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : true
    },
    "params-only" : {
      "validateRequestParameters" : true,
      "validateRequestBody" : false
    }
  }
}
```

------

# AWS CloudFormation template API sampel dengan validasi permintaan dasar
<a name="api-gateway-request-validation-sample-cloudformation"></a>

 CloudFormation Contoh definisi template berikut mendefinisikan API sampel dengan validasi permintaan diaktifkan. API adalah bagian dari [PetStoreAPI](http://petstore-demo-endpoint.execute-api.com/petstore/pets). Ini mengekspos `POST` metode untuk menambahkan hewan peliharaan ke `pets` koleksi dan `GET` metode untuk menanyakan hewan peliharaan dengan jenis tertentu. 

 Ada dua validator permintaan yang dideklarasikan:

**`GETValidator`**  
Validator ini diaktifkan pada metode. `GET` Ini memungkinkan API Gateway untuk memverifikasi bahwa parameter kueri yang diperlukan (`q1`) disertakan dan tidak kosong dalam permintaan yang masuk. 

**`POSTValidator`**  
Validator ini diaktifkan pada metode. `POST` Ini memungkinkan API Gateway untuk memverifikasi bahwa format permintaan payload mematuhi yang ditentukan `RequestBodyModel` ketika jenis konten `application/json` jika tidak ada jenis konten yang cocok ditemukan, validasi permintaan tidak dilakukan. Untuk menggunakan model yang sama terlepas dari jenis konten, tentukan`$default`. `RequestBodyModel`berisi model tambahan,`RequestBodyModelId`, untuk menentukan ID hewan peliharaan.

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  StageName:
    Type: String
    Default: v1
    Description: Name of API stage.
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: ReqValidatorsSample
  RequestBodyModelId:
    Type: 'AWS::ApiGateway::Model'
    Properties:
      RestApiId: !Ref Api
      ContentType: application/json
      Description: Request body model for Pet ID.
      Schema:
        $schema: 'http://json-schema.org/draft-04/schema#'
        title: RequestBodyModelId
        properties:
            id:
              type: integer
  RequestBodyModel: 
    Type: 'AWS::ApiGateway::Model'
    Properties:
      RestApiId: !Ref Api
      ContentType: application/json
      Description: Request body model for Pet type, name, price, and ID.
      Schema:
        $schema: 'http://json-schema.org/draft-04/schema#'
        title: RequestBodyModel
        required:
          - price
          - name
          - type
        type: object
        properties:
            id:
              "$ref": !Sub 
                - 'https://apigateway.amazonaws.com/restapis/${Api}/models/${RequestBodyModelId}'
                - Api: !Ref Api
                  RequestBodyModelId: !Ref RequestBodyModelId
            price: 
              type: number
              minimum: 25
              maximum: 500
            name:
              type: string
            type:
              type: string
              enum:
                - "dog"
                - "cat"
                - "fish"
  GETValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: params-only
      RestApiId: !Ref Api
      ValidateRequestBody: False
      ValidateRequestParameters: True 
  POSTValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: body-only
      RestApiId: !Ref Api
      ValidateRequestBody: True
      ValidateRequestParameters: False
  ValidationResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'validation'
  ValidationMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref ValidationResource
      HttpMethod: GET
      AuthorizationType: NONE
      RequestValidatorId: !Ref GETValidator
      RequestParameters:
        method.request.querystring.q1: true
      Integration:
        Type: HTTP_PROXY
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
  ValidationMethodPost:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref ValidationResource
      HttpMethod: POST
      AuthorizationType: NONE
      RequestValidatorId: !Ref POSTValidator
      RequestModels:
        application/json : !Ref RequestBodyModel 
      Integration:
        Type: HTTP_PROXY
        IntegrationHttpMethod: POST
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - ValidationMethodGet
      - RequestBodyModel 
    Properties:
      RestApiId: !Ref Api
      StageName: !Sub '${StageName}'
Outputs:
  ApiRootUrl:
    Description: Root Url of the API
    Value: !Sub 'https://${Api}.execute-api.${AWS::Region}.amazonaws.com/${StageName}'
```