Compartilhar via


Seguir padrões de codificação

Ao criar um conector personalizado, siga estas práticas recomendadas em seu código.

Definição de API

O apiDefinition.swagger.json, também conhecido como swagger, é onde o comportamento do conector é definido.

  • Recuo: use guias simples com quatro espaços, e não use guias complexas.
  • Remover espaço à direita: o espaço à direita inclui todos os espaços em branco localizados no final de uma linha quando não há outro caractere em seguida. As tabs complexas contam como um espaço à direita se não houver caracteres em seguida.

Estrutura do arquivo

Para ter uma definição de swagger legível, crie uma definição de API com a seguinte estrutura:

  1. Versão SwaggerOpenAPI (no momento, apenas a versão 2.0 está disponível)
  2. Informações sobre o conector (título, descrição, status, contatos)
  3. Hosts e esquemas disponíveis
  4. Seção Consome/produz
  5. Caminhos (definições de ações e gatilhos)
  6. Definições (tipos de dados usados em ações e gatilhos)
  7. Parâmetros (parâmetros que podem ser usados nas operações)

Ações e gatilhos

Use o uso de maiúsculas e minúsculas de Pascal no operationId: coloque todas as palavras em maiúsculo (incluindo a primeira). Não adicione hífens (-) ou sublinhados (_) para separar palavras.

  • Boa

    "operationId": "GetMessages",
    
  • Ruim

    "operationId": "getMessages",
    "operationId": "Get-Messages",
    "operationId": "Get_Messages",
    

Resumo e descrição

As operações devem sempre ter um resumo e uma descrição. O resumo será o nome da operação, portanto, mantenha-o curto e preciso, a descrição deve fornecer mais informações e terminar com um ponto (.).

A maioria das descrições são colocadas como dicas nas caixas de parâmetros, certifique-se de fornecer um texto curto e significativo. Descrições e resumos não devem ter o mesmo conteúdo.

  • Boa

    "summary": "List Name",
    "description": "The list to check for messages.",
    
  • Ruim

    "summary": "List",
    "description": "List.",
    

RESPOSTAS

Defina o seu código de sucesso usando um HTTP com tipo de resposta 2xx. Não use default como sua única resposta definida Em vez disso, combine-a com uma definição de sucesso. Se possível, indique também os as respostas 4xx/5xx conhecidas.

  • Use tipos de erro 4xx quando o problema for causado pelo cliente. Veja alguns exemplos:

    • 401 - The username is invalid (it can only contain lowercase letters and numbers)
  • Use tipos de erro 5xx quando o problema for causado pelo servidor

    • 504 - The request timed-out
  • Boa

    {
      "responses": {
        "200": {
          "description": "OK",
          "schema": {
            "$ref": "#/definitions/Message"
          }
        },
        "400": {
          "description": "Bad Request"
        },
        "404": {
          "description": "Not Found"
        },
        "401": {
          "description": "Unauthorized"
        },
        "403": {
          "description": "Forbidden"
        },
        "500": {
          "description": "Internal Server Error. Unknown error occurred"
        },
        "default": {
          "description": "Operation Failed."
        }
      }
    }
    
  • Ruim

    {
      "responses": {
        "default": {
          "description": "OK",
          "schema": {
            "type": "string"
          }
        }
      }
    }
    

Definições e parâmetros

No caso de parâmetros que aparecem em mais de uma operação, crie um parâmetro de nome na seção parameters em vez de definir este parâmetro em cada operação que o utiliza.

  • Boa

    Neste exemplo, o parâmetro id é definido em IdInPath e usado nas operações GetMemberGroups e RemoveMemberFromGroup.

    {
      "paths": {
        "/groups/{id}/getMemberGroups": {
          "post": {
            "summary": "Get groups of a user",
            "description": "Get the groups a user is a member of.",
            "operationId": "GetMemberGroups",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              }
            ],
            "responses": {
              // response definitions
            }
          }
        },
        "/groups/{id}/members/{memberId}/delete": {
          "delete": {
            "summary": "Remove member",
            "description": "Delete a member from a group.",
            "operationId": "RemoveMemberFromGroup",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              },
              {
                "name": "memberId",
                "in": "path",
                "required": true,
                "description": "The Id of the member to be deleted.",
                "x-ms-summary": "Member Id",
                "type": "string"
              }
            ],
            "responses": {
              // response definitions
            }
          }
        }
      },
      // definitions
      "parameters":{
        "IdInPath": {
          "name": "id",
          "in": "path",
          "description": "Unique identifer of a group (Ex. 'id_group1').",
          "required": true,
          "x-ms-summary": "Group Id",
          "type": "string"
        },
      }
    }
    

    O uso de referências em parâmetros e definições tornará o ApiDefinition mais fácil de manter. Por exemplo, se a descrição precisar de uma atualização, isso será feito em apenas um lugar, em vez de todas as operações que a utilizam.

  • Ruim

    {
      "paths": {
        "/groups/{id}/getMemberGroups": {
          "post": {
            "summary": "Get groups of a user",
            "description": "Get the groups a user is a member of.",
            "operationId": "GetMemberGroups",
            "parameters": [
              {
                "name": "id",
                "in": "path",
                "description": "Unique identifer of a group (Ex. 'id_group1').",
                "required": true,
                "x-ms-summary": "Group Id",
                "type": "string"
              }
            ],
            "responses": {
              // response definitions
            }
          }
        },
        "/groups/{id}/members/{memberId}/delete": {
          "delete": {
            "summary": "Remove member",
            "description": "Delete a member from a group.",
            "operationId": "RemoveMemberFromGroup",
            "parameters": [
              {
                "name": "id",
                "in": "path",
                "description": "Unique identifer of a group (Ex. 'id_group1').",
                "required": true,
                "x-ms-summary": "Group Id",
                "type": "string"
              },
              {
                "name": "memberId",
                "in": "path",
                "required": true,
                "description": "The Id of the member to be deleted.",
                "x-ms-summary": "Member Id",
                "type": "string"
              }
            ],
            "responses": {
              // response definitions
            }
          }
        }
      }
    }
    

Crie uma entrada nas definições e use essa referência nas operações que têm a mesma resposta do objeto.

  • Boa

    Neste exemplo, além de usar um parâmetro referenciado, as operações GetUser e UpdateUser se referem à mesma resposta do objeto UserResponse, definido uma vez na seção definitions.

    {
      "paths": {
        "/v1.0/users/{id}": {
          "get": {
            "summary": "Get user",
            "description": "Get details for a user.",
            "operationId": "GetUser",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              }
            ],
            "responses": {
              "200": {
                "description": "200",
                "schema": {
                  "$ref": "#/definitions/UserResponse"
                }
              }
            }
          },
          "patch": {
            "summary": "Update user",
            "description": "Update the info for a user.",
            "operationId": "UpdateUser",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              }
            ],
            "responses": {
              "201": {
                "description": "Accepted",
                "schema": {
                  "$ref": "#/definitions/UserResponse"
                }
              }
            },
            "deprecated": false,
            "x-ms-no-generic-test": true
          }
        },
      },
      // definitions
      "definitions":{
       "UserResponse": {
          "type": "object",
          "properties": {
            "id": {
              "description": "The unique identifier for the user.",
              "type": "string",
              "x-ms-summary": "Id"
            },
            "email": {
              "description": "The email associated to the user.",
              "type": "string",
              "x-ms-summary": "Email"
            },
            // more fields here
          }
        }
      }
    }
    
  • Ruim

    {
      "paths": {
        "/v1.0/users/{id}": {
          "get": {
            "summary": "Get user",
            "description": "Get details for a user.",
            "operationId": "GetUser",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              }
            ],
            "responses": {
              "200": {
                "description": "200",
                "schema": {
                  "$ref": "#/definitions/UserResponse"
                }
              }
            }
          },
          "patch": {
            "summary": "Update user",
            "description": "Update the info for a user.",
            "operationId": "UpdateUser",
            "parameters": [
              {
                "$ref": "#/parameters/IdInPath"
              }
            ],
            "responses": {
              "201": {
                "description": "Accepted",
                "schema": {
                  "$ref": "#/definitions/UserResponse"
                }
              }
            },
            "deprecated": false,
            "x-ms-no-generic-test": true
          }
        },
      },
      // definitions
      "definitions":{
       "UserResponse": {
          "type": "object",
          "properties": {
            "id": {
              "description": "The unique identifier for the user.",
              "type": "string",
              "x-ms-summary": "Id"
            },
            "email": {
              "description": "The email associated to the user.",
              "type": "string",
              "x-ms-summary": "Email"
            },
            // more fields here
          }
        }
      }
    }
    

Enviar comentários

Agradecemos muito os comentários sobre problemas com nossa plataforma de conectores ou novas ideias de recursos. Para fornecer comentários, acesseEnviar problemas ou obter ajuda com conectores e selecione o tipo de comentário.