Передача параметра пути в конечных точках Google в бэкэнд не работает - PullRequest
1 голос
/ 16 марта 2020

Моя установка содержит конечные точки google с функциями google-cloud в качестве моего бэкэнда.

Конечные точки Google определены с помощью следующего swagger v2 yaml:

swagger: "2.0"
info:
  description: "yada..."
  version: "0.0.1"
  title: "yadada.."
  termsOfService: "http://swagger.io/terms/"
  contact:
    name: "blah"
    email: "email@mail.com"
    url: "https://example.com"
host: "(generated service url by google when endpoints is deployed, i.e. 'api-gateway-xyz123123-ew.a.run.app')"
tags:
  - name: "Documents"
    description: "blah"
schemes:
  - "https"
paths:
  /api/documents:
    post:
      tags:
        - "Documents"
      summary: "Add a new document"
      description: ""
      security:
        - firebase: []
      operationId: "addDocument"
      x-google-backend:
        address: "(cloud functions http url)/documents"
      consumes:
        - "application/json"
      produces:
        - "application/json"
      parameters:
        - in: "body"
          name: "body"
          description: "Document supplied"
          required: true
          schema:
            $ref: "#/definitions/Document"
      responses:
        201:
          description: "The document was successfully created."
          schema:
            $ref: "#/definitions/Document"
        400:
          description: "Invalid input. See response for details"
          schema:
            items:
              $ref: "#/definitions/Error"
  /api/documents/{document_id}:
    get:
      tags:
        - "Documents"
      summary: "Get a document with the given ID"
      description: ""
      security:
        - firebase: []
      operationId: "getDocument"
      x-google-backend:
        address: "(cloud function http url)/documents/"
        path_translation: APPEND_PATH_TO_ADDRESS
      produces:
        - "application/json"
      parameters:
        - in: "path"
          name: "document_id"
          description: "ID of the document to modify"
          required: true
          type: "string"
      responses:
        200:
          description: "success."
          schema:
            type: "array"
            items:
              $ref: "#/definitions/Document"
        404:
          description: "Document not found"
          schema:
            items:
              $ref: "#/definitions/Error"
securityDefinitions:
  firebase:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://securetoken.google.com/%%GOOGLE_PROJECT_ID%%"
    x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
    x-google-audiences: "%%GOOGLE_PROJECT_ID%%"
definitions:
  (a lot of type definitions)

Это работает с POST Конечная точка без проблем.

Проблема в конечной точке GET REST, где переменная пути неправильно передается в бэкэнд.

Как и в https://cloud.google.com/endpoints/docs/openapi/openapi-extensions Я пытался добавить параметр x-google-backend, как показано в приведенном выше API-интерфейсе swagger. (path_translation: APPEND_PATH_TO_ADDRESS).

Однако это не работает. Я получаю несанкционированную ошибку (403), так как облачная функция не попадает во внешний интерфейс конечных точек.

В настоящее время я использую уродливый обходной путь без параметра path_translation, который переводит переменную пути конечных точек Google в параметр запроса в облаке Бэкэнд функции с тем же именем. Т.е. в бэкэнде вызывается URL /documents?document_id=xyz.

(чего я пытаюсь добиться - это передать вызов с URL-адресом бэкэнда /documents/{document_id})

Кто-нибудь знает, как настроить путь на основе параметров правильно, чтобы они правильно передавались в бэкэнд облачной функции?

Заранее спасибо.

С уважением, Себастьян

1 Ответ

2 голосов
/ 17 марта 2020

TL; DR: я предполагаю, что ваша ошибка 403 не является правильной ошибкой. Это должно быть 404, но, поскольку конечная точка неизвестна, я думаю, что ответ 403.

Конечная точка облака разочарована таким поведением. С path_translation: APPEND_PATH_TO_ADDRESS вы думаете, что ваш последний вызываемый адрес будет /documents/{document_id}, но NO . Полный путь openAPI добавляется к вашему внутреннему адресу, в вашем случае: /documents/api/documents/{document_id}

Именно поэтому конечная точка не существует, и у вас должно быть 404 (а не 403).

Для более подробной информации, вы можете посмотреть эту страницу .

Примечание: я связан с командой Google по этой теме c, и потребуется некоторое время, чтобы получить обновление об этом поведении.

...