При обращении к API от Postman я получаю эту ошибку.
https://account-perf.myglobal.com/v1/users/00uk0khprrME7gZOU0h7/credentials/change_password
Content-Type:application/json
Authorization:Bearer n7mbkw74jsubd7rauhptdnre
СООБЩЕНИЕ
{"password":"Baddy125@","token":"eyJhbGci...."}
Вызов веб-сервиса для генерации токена
https://api-perf.myglobal.com/rest/oauth2/v1/токен
СООБЩЕНИЕ
client_id:abcd
client_secret:xyz
grant_type:client_credentials





Проанализируйте и проверьте путь запроса, если запрос неверен, эта ошибка выдается на шлюзе API. Я наступил на ту же ошибку, когда исправил параметры запроса, все заработало.
Дайте мне знать.
У меня было это всякий раз, когда вызывался любой необработанный метод или ресурс конечной точки. Моя установка представляет собой шлюз API с определенными ресурсами (например, /myendpoint) и определенными методами для этих конечных точек (например, GET).
Чтобы исправить это, я создал лямбда-функцию Node.js, которая только что вернула ошибку 404. Затем я добавил любой метод ANY в корень конечных точек / и указал его как прокси-функцию Lambda для ЛЮБЫХ методов.
Затем я добавил прокси-ресурс, например. /{proxy} -- есть флажок, который вы можете установить при создании ресурса, чтобы передать его прокси. Метод ANY для этого ресурса, указывающий на ту же функцию Lambda, развертывание API, и все готово.
Теперь вместо ошибки токена носителя авторизации я получаю правильную ошибку HTTP 404.
@Matt H - Это довольно хорошая идея, которая вдохновила меня на еще одну.
Предполагая, что все остальные пути в API указаны явно, я создал путь по умолчанию /{proxy+}, который будет возвращать http 404, ресурс сообщения не найден. Вместо использования лямбда я смог создать фиктивный ответ, поэтому нет никаких затрат на то, чтобы заставить лямбду вернуть ответ.
Я создал свои API через спецификацию Open API. Вот как мой YAML для реализации хотел бы
/{proxy+}:
x-amazon-apigateway-any-method:
responses:
404:
description: "404 response"
content: {}
x-amazon-apigateway-integration:
responses:
404:
statusCode: "404"
responseTemplates:
application/json: "{\"message\":\"resource not available\"}"
requestTemplates:
application/json: "{\"statusCode\": 404}"
passthroughBehavior: "when_no_templates"
type: "mock"
Serverless также имеет возможность указать встроенный фиктивный ответ. Ниже может быть образец:
functions:
default:
handler: handler.default
events:
- http:
path: hello
cors: true
method: get
integration: mock
request:
template:
application/json: '{"statusCode": 404}'
response:
template: $input.path('$')
statusCodes:
404:
pattern: '' #default method
template:
application/json: '{"statusCode": 404, "message":"resource not found"}'
бессерверный документ: https://www.serverless.com/framework/docs/providers/aws/events/apigateway/#custom-response-templates
Мне удалось сделать это, проксировав маршрут ANY /{proxy+} к лямбде, которая всегда будет отвечать HTTP 404.
Поскольку все остальные маршруты настроены точно, этот ANY /{proxy+} маршрут действует как маршрут по умолчанию и будет перехватывать любой несоответствующий запрос.
Вот как я это сделал с CloudFormation:
Parameters:
RestAPI:
Type: String
RestApiRootResourceId:
Type: String
LambdaName:
Type: String
Path:
Type: String
RootResource:
Type: AWS::ApiGateway::Resource
Properties:
RestApiId: !Ref RestAPI
ParentId: !Ref RestApiRootResourceId
PathPart: !Ref Path
ProxyResource:
Type: 'AWS::ApiGateway::Resource'
Properties:
RestApiId: !Ref RestAPI
ParentId: !Ref RestApiRootResourceId
PathPart: "{proxy+}"
AnyMethod:
Type: 'AWS::ApiGateway::Method'
Properties:
RestApiId: !Ref RestAPI
ResourceId: !Ref ProxyResource
HttpMethod: ANY
Integration:
IntegrationHttpMethod: POST
Type: AWS_PROXY
PassthroughBehavior: WHEN_NO_MATCH
Uri:
Fn::Join:
- ":"
- - !Sub "arn:aws:apigateway:${AWS::Region}:lambda"
- !Sub "path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function"
- !Sub "${LambdaName}/invocations"
ApiGatewayInvokeLambdaPermissionAny:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName:
Fn::Join:
- ":"
- - !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function"
- !Ref LambdaName
Principal: apigateway.amazonaws.com
SourceArn:
Fn::Join:
- ":"
- - !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}"
- !Sub "${RestAPI}/*/ANY/*"
Параметры:
!GetAtt "RestApi.RootResourceId")
n7mbkw74jsubd7rauhptdnreкак вы сгенерировали это значение?