it-swarm.dev

Dapatkan pesan kesalahan terperinci dari AWS API Gateway Validator Permintaan

Latar Belakang

Saya memiliki API Gateway yang dibuat menggunakan definisi Swagger 2.0 dengan ekstensi API Gateway .

Saya mengesampingkan respons API Gateway default, misalnya:

x-Amazon-apigateway-gateway-responses:
  BAD_REQUEST_BODY:
    statusCode: 400
    responseTemplates:
      application/json: |
        {
          "error": {
            "code": 400,
            "stage": "$context.stage",
            "request": "$context.requestId",
            "message": "$context.error.message"
          }
        }

$context dalam muatan di atas berasal dari variabel Gateway API .

Sumber/metode sampel di API saya terlihat seperti ini (selalu LAMBDA_PROXY integrasi):

paths:
  /test:
    post:
      parameters:
        - in: body
          name: Test
          required: true
          schema:
          $ref: "#/definitions/Test"
      responses:
        201:
          description: Created
        400:
          description: Bad Request
        401:
          description: Unauthorized
        403:
          description: Forbidden
      x-Amazon-apigateway-integration:
      uri: >-
        arn:aws:apigateway:${region}:lambda:path/2015-03-31/functions/${lambda}/invocations
      type: aws_proxy
      httpMethod: POST
      credentials: "${credentials}"
      passthroughBehavior: never

Dengan definisi muatan permintaan yang sesuai:

definitions:
  Test:
    type: object
    title: Test
    required:
      - date
    properties:
      date:
        type: string
        pattern: "^20[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$"
        description: Date in YYYY-MM-DD Format

Dan ekstensi validator permintaan :

x-Amazon-apigateway-request-validator: body
x-Amazon-apigateway-request-validators:
  body:
    validateRequestBody: true
    validateRequestParameters: false

Masalah

Ketika saya menyebut titik akhir ini dengan date yang hilang atau tidak valid, saya selalu mendapatkan respons yang sama:

{
    "error": {
        "code": 400,
        "stage": "latest",
        "request": "6b7a64f5-e7f0-11e7-845b-f53ceb4cb049",
        "message": "Invalid request body"
    }
}

Namun, ketika saya mengujinya melalui konsol API Gateway tanpa properti date:

Request body does not match model schema for content type application/json: [
  object has missing required properties (["date"])
]

Dan dengan date yang tidak valid:

Request body does not match model schema for content type application/json: [
  ECMA 262 regex "^20[0-9]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$" does not match input string "2017/12/25"
]

Pertanyaan

Bagaimana saya bisa mengakses pesan kesalahan terperinci sehingga saya bisa memperkaya respons kesalahan saya dengan pesan yang lebih deskriptif daripada Invalid request body? Saya menduga ini harus dimungkinkan, mungkin menggunakan x-Amazon-apigateway-gateway-responses mapping, tapi sejauh ini saya belum bisa melakukannya.

16
Alix Axel

(Pengembang di API Gateway)

Sayangnya, ini tidak didukung saat ini. Kami secara aktif berupaya memperbaiki masalah ini, tetapi saya tidak dapat memberi Anda jadwal waktu kapan hal ini dapat didukung.

11
Abhigna Nagaraja

Ini bukan jawaban untuk pertanyaan Anda melainkan solusi alternatif yang telah kami gunakan di aplikasi kami yang memiliki tujuan yang sama (validasi permintaan).

API tanpa server kami mulai dengan mendefinisikan semua titik akhir kami di API Gateway (lengkap dengan dokumentasi Swagger). Seiring waktu, kami telah menambahkan lebih banyak titik akhir (sekitar 60+ titik akhir yang terdiri dari titik akhir warisan REST, titik akhir publik REST, dan titik akhir graphQL pribadi).

Mengelola jumlah titik akhir ini melalui API Gateway terbukti sangat membosankan, dan waktu penggunaannya sangat lama (kami menggunakan serverless).

Akhirnya, kami memutuskan untuk menguranginya menjadi tiga aplikasi tanpa server "monolith". Dua titik akhir REST dan satu titik akhir GraphQL.

Jadi pada dasarnya, kami menangani perutean di dalam penangan Lambda kami (dan perutean tidak diperlukan untuk GraphQL).

Untuk validasi permintaan, ia datang gratis dengan GraphQL (alasan lain untuk menyukai GraphQL). Adapun penangan REST kami, kami menggunakan skema JSON dan kesalahan validasi apa pun, kami dapat dengan mudah kembali ke klien bersama dengan pesan kesalahan HTTP 400.

2
dashmug

Karena pengembang API Gateway telah menjawab pertanyaan, saya masih ingin menambahkan beberapa tips untuk Anda, mungkin itu membantu dan itu bisa menjadi jawaban yang diterima!

Untuk pertanyaan Anda, sebenarnya Anda perlu mengaktifkan log cloudwatch untuk gerbang api, dengan itu, Anda bisa mendapatkan lebih banyak log dari sebelumnya. 

Beri tahu saya jika menyertakan detail untuk Request Validator

Dokumen aws ini - Bagaimana cara mengaktifkan Amazon CloudWatch Logs untuk API yang saya buat di Amazon API Gateway? Memberikan langkah-langkah tentang cara mengaktifkannya.

Tapi saya lebih suka menggunakan dokumen ini API Gateway dan Lambda Logs , yang memberikan tangkapan layar untuk ditindaklanjuti dengan mudah.

Di gerbang api Anda, Anda akan melihat ini diaktifkan. enter image description here

Akses gateway API beberapa kali, masuklah ke grup log yang bernama:

API-Gateway-Execution-Logs_{rest-api-id}/{stage_name}

enter image description here

Yang memiliki detail lebih banyak daripada informasi yang Anda miliki sebagai Invalid request body dan lainnya, seperti {"message": "Internal server error"}. Ini adalah fitur yang sangat berguna, yang menyelamatkan saya banyak waktu mengatasi masalah serverless dan api gateway.

2
BMW

Dalam hal ini, di dalam bagian Respons Gateway, buka: 

Bad Request Body [400]

Change the value of the body mapping template to: 

{"message":$context.error.validationErrorString}

Keluaran Keluaran: 

{
"message": "[instance value (\"us\") not found in enum (possible values: [\"usd\",\"eur\",\"gbp\",\"jpy\",\"aud\",\"chf\",\"cad\",\"nzd\"])]"
}
1
sandesh