Ошибка шлюза AWS API при выполнении запроса OPTIONS

Я использую CFT для создания env для своего API. Я добавил ВАРИАНТЫ для CORS. Я заметил, что когда я делаю тест от AWS console for OPTIONS, я получаю ответ 200. Однако, когда я делаю то же самое с CURL or PostMan, я получаю 500 внутреннюю ошибку сервера. После рассмотрения вопросов SO, связанных с ним. Я изменил ответ интеграции на CONVERT_TO_TEXT. но это тоже не решило проблему.

Я заметил проводное поведение в журнале. Ниже приведен фрагмент журнала для запроса из консоли AWS:

Sat Apr 13 15:06:26 UTC 2019 : Method request headers: { Access-Control-Request-Method= POST, Content-Type= application/json}
Sat Apr 13 15:06:26 UTC 2019 : Method request body before transformations: 
Sat Apr 13 15:06:26 UTC 2019 : Method response body after transformations: 
Sat Apr 13 15:06:26 UTC 2019 : Method response headers: {X-Requested-With=*, Access-Control-Allow-Headers=Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-requested-with, Access-Control-Allow-Origin=*, Access-Control-Allow-Methods=POST,OPTIONS, Content-Type=application/json}
Sat Apr 13 15:06:26 UTC 2019 : Successfully completed execution
Sat Apr 13 15:06:26 UTC 2019 : Method completed with status: 200

Но тот же запрос, когда я даю из CRUL или PM, я вижу следующий журнал:

Method request path: {}
Method request query string: {}
Method request headers:  Method request headers: {Accept=*/*, CloudFront-Viewer-Country=IN, CloudFront-Forwarded-Proto=https, CloudFront-Is-Tablet-Viewer=false, CloudFront-Is-Mobile-Viewer=false, User-Agent=curl/7.55.1, X-Forwarded-Proto=https, CloudFront-Is-SmartTV-Viewer=false, Host=MYHOST, X-Forwarded-Port=443,   (CloudFront), Access-Control-Request-Method=POST, CloudFront-Is-Desktop-Viewer=true, Content-Type=application/json}
Method request body before transformations: [Binary Data]
Execution failed due to configuration error: Unable to transform request
Method completed with status: 500

Мы видим, что он пытается преобразовать [Binary Data], но я ничего не отправляю.

Завиток, который я использовал: curl -X OPTIONS -H "Access-Control-Request-Headers: Content-Type" -H "Access-Control-Request-Method: POST" -H "Access-Control-Allow-Origin: '*'" -v MYHOST

Почему я вижу эту разницу в журнале? что пошло не так в моей конфигурации? Вы можете помочь мне.

ОБНОВЛЕНИЕ: я использую приведенный ниже CFT

Type: AWS::ApiGateway::Method
Properties:
  AuthorizationType: NONE
  HttpMethod: OPTIONS
  Integration:
    Type: MOCK
    IntegrationResponses:
    - StatusCode: 200
      ResponseParameters:
        method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
        method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
        method.response.header.Access-Control-Allow-Origin: "'*'"
    RequestTemplates:
      application/json:
        Fn::Join:
        - ''
        - - "{"
          - ' {"statusCode":200} '
          - "}"
  MethodResponses:
  - StatusCode: 200
    ResponseParameters:
      method.response.header.Access-Control-Allow-Headers: true
      method.response.header.Access-Control-Allow-Methods: true
      method.response.header.Access-Control-Allow-Origin: true

person backtrack    schedule 13.04.2019    source источник
comment
Попробуйте удалить «-H Content-Type: application/json». Ваш браузер не отправляет заголовок Content-Type в запросе OPTIONS. (Он отправляет это только в запросе POST.) Вам также необходимо отправить заголовок запроса Access-Control-Request-Headers.   -  person sideshowbarker    schedule 13.04.2019
comment
Привет @sideshowbarker - я пробовал, но все равно та же ошибка   -  person backtrack    schedule 13.04.2019
comment
stackoverflow.com/q/44067102/441757 выглядит актуальным. Похоже, вы можете получить лучшую помощь, если опубликуете свое значение x-amazon-apigateway-integration и если опубликуете шаблон, который используете для запросов OPTIONS. Кроме того, чтобы быть ясным: вы не получаете такой же сбой при тестировании запросов POST с помощью curl или Postman? См. также forums.aws.amazon.com/thread.jspa?threadID=256140< /а>   -  person sideshowbarker    schedule 14.04.2019
comment
@sideshowbarker - Пожалуйста, обратитесь к разделу обновлений в моем посте.   -  person backtrack    schedule 14.04.2019
comment
@backtrack вам удалось решить эту проблему? если да, не могли бы вы дать ответ на ваш вопрос, подробно описав, как вы решили эту проблему. Спасибо.   -  person M. Ali Iftikhar    schedule 29.05.2020


Ответы (1)


кажется, что есть менее документированное требование добавить параметр contentHandling: CONVERT_TO_TEXT как к параметрам запроса интеграции, так и к настройкам ответа интеграции.

В swagger конфигурация CORS будет выглядеть примерно так:

responses: {
  200: {
    description: "Returning CORS headers",
    headers: {
      "Access-Control-Allow-Headers":{ type: "string" },
      "Access-Control-Allow-Methods": { type: "string" },
      "Access-Control-Allow-Origin": { type: "string" },
    }
  }
},
"x-amazon-apigateway-integration": {
  type: "mock",
  contentHandling: "CONVERT_TO_TEXT", // Resolves problems with cloudfront binary content issues
  requestTemplates: {
    "application/json": "{ \"statusCode\": 200 }"
  },
  responses: {
    "default": {
      statusCode: "200",
      contentHandling: "CONVERT_TO_TEXT", // Resolves problems with cloudfront binary content issues
      responseParameters: {
        "method.response.header.Access-Control-Allow-Headers": "'*'",
        "method.response.header.Access-Control-Allow-Methods" : "'*'",
        "method.response.header.Access-Control-Allow-Origin" : "'*'"
      },
      responseTemplates: {
        "application/json": "{}"
      }
    }
  }
}
person Jarek Nowotka    schedule 14.09.2020
comment
Бесконечно благодарен! У меня была очень похожая проблема, и ваш ответ указал мне правильное направление! Я удалил тип двоичного носителя */*, и MOCK больше не дает сбоев при разборе предварительных проверок! - person bgw; 08.04.2021