Repousante
Dec 16 2022
.
- Quais são as seis restrições da API REST?
- Cliente — Arquitetura do servidor — Esta regra garante a separação de interesses. O cliente gerencia as preocupações da interface do usuário enquanto o servidor gerencia as questões de persistência de dados. Em troca, obtemos um sistema altamente portátil onde uma vez que a API REST pode gerenciar diferentes clientes.
- Stateless — Nenhum dado do cliente pode ser armazenado no servidor entre as solicitações. Caso o estado do cliente seja relevante para as requisições, ele deve ser enviado junto com as requisições. Se o servidor precisar salvar as sessões do cliente, elas devem ser salvas em um banco de dados por um determinado período.
- Cacheability — Todas as respostas devem ser marcadas como armazenáveis em cache ou não armazenáveis em cache. Se a resposta puder ser alterada constantemente, não devemos armazená-los em cache. A capacidade de cache é importante para o desempenho da API REST.
- Sistema em Camadas — O cliente não pode saber/não deve se importar se está conectado diretamente ao servidor original ou intermediário ao longo do caminho. Isso significa que o REST permite que você tenha uma arquitetura de sistema em camadas e a solicitação pode ser enviada por diferentes camadas. Isso ajuda na segurança e escalabilidade (CDN, servidor de autorização).
- Código sob demanda — a API REST pode transferir arquivos JavaScript executáveis e componentes compilados para o cliente quando necessário.
- Interface Uniforme — Como o nome indica, deve haver uma interface para os recursos que são expostos aos clientes da API. Um recurso no servidor deve ter apenas um URI lógico para recuperar ou manipular o recurso.
- baseado na arquitetura cliente-servidor
- e deseja atender diferentes clientes por meio do protocolo HTTP
- e deseja usar as restrições REST descritas acima
############################################################################
# Movie Apis Definitions #
############################################################################
# Code completion support is available so start typing for available options.
swagger: '2.0'
# This is your document metadata
info:
version: "1.0.1"
title: The movie api
# Describe your paths here
paths:
# This is a path endpoint. Change it.
/movies:
# This is a HTTP operation
get:
# Describe this verb here. Note: you can use markdown
description: Returns all movies
operationId: getMovies
# Expected responses for this operation:
responses:
# Response code
200:
description: Successful response
# A schema describing your response object.
# Use JSON Schema format
schema:
title: ArrayOfMovies
type: array
items:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
post:
description: Add a new movie
operationId: addMovie
parameters:
- name: movie
in: body
description: The new movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'201':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
/movies/{id}:
parameters:
- name: id
in: path
description: ID of the movie
required: true
type: integer
format: int64
get:
description: Returns a single movie
operationId: getMovieById
responses:
200:
description: Successful response
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
put:
description: Update an existing movie
operationId: updateMovieById
parameters:
- name: movie
in: body
description: The movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'200':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
delete:
description: Delete a movie
operationId: deleteMovieById
responses:
'204':
description: Movie deleted
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
definitions:
movie:
type: object
required:
- id
- title
properties:
id:
type: integer
format: int64
title:
type: string
ratings:
type: object
properties:
criticsScore:
type: integer
minimum: 0
maximum: 100
audienceScore:
type: integer
minimum: 0
maximum: 100
criticsConsensus:
type: string
abridgedDirectors:
type: array
items:
type: string
abridgedCast:
type: array
items:
$ref: '#/definitions/cast'
posters:
$ref: '#/definitions/posters'
cast:
type: object
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
characters:
type: array
items:
type: string
posters:
properties:
thumbnail:
type: string
format: uri
profile:
type: string
format: uri
detailed:
type: string
format: uri
original:
type: string
format: uri
- Use OAuth2 para proteger sua API.
- Use um token Bearer de expiração automática para autenticação (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Requer HTTPS.
- Considere o uso de JSON Web Tokens .
- Imponha o uso dos cabeçalhos Content-Type e Accept-Type, mesmo se você usar JSON como padrão para solicitações e respostas.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Nível 0: Defina um URI e todas as operações são solicitações POST para este URI.
- Nível 1: Crie URIs separados para recursos individuais.
- Nível 2: Use métodos HTTP para definir operações em recursos.
- Nível 3: Use hipermídia (HATEOAS, descrito abaixo).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- Para um método POST, o URI representa um recurso pai da nova entidade, como uma coleção. Por exemplo, para criar um novo filme, o URI pode ser
/api/movies. O servidor cria a entidade e atribui a ela um novo URI, como/api/movies/6812360. Esse URI é retornado no cabeçalho Location da resposta. Cada vez que o cliente enviar uma solicitação, o servidor criará uma nova entidade com um novo URI. - Para um método PUT, o URI identifica a entidade. Se já existir uma entidade com esse URI, o servidor atualiza a entidade existente com a versão da solicitação.
- Cache-Control — O número máximo de segundos (ttl) que uma resposta pode ser armazenada em cache. (
Cache-Control: public, 360ouCache-Control: no-store) - O cache forte minimiza o número de solicitações que um servidor recebe
- Considere o cache fraco por meio do
ETagcabeçalho de resposta - ETag — Use um hash SHA1 para a versão de um recurso. Certifique-se de incluir o tipo de mídia no valor de hash, porque isso cria uma representação diferente. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). O cliente precisa enviar um cabeçalho If-None-Match para que esse mecanismo funcione. - O cache fraco minimiza o trabalho que um servidor precisa fazer (mas não o número de solicitações que ele recebe)
- Habilite o cache baseado em cabeçalho em todos os proxies e clientes (por exemplo, NGINX, Apache, APIM) para aumentar a velocidade e a robustez
- Nenhum dado que comprometa a privacidade ou a segurança nas URLs
- Implemente a criptografia de conteúdo nos endpoints mais distantes (no servidor REST, não nos proxies ou APIM)
- Quando a assinatura de conteúdo é usada, isso é feito depois que o conteúdo é (opcionalmente) criptografado.
- Use o cabeçalho X-Signing-Algorithm para comunicar o tipo de assinatura de conteúdo (
X-Signing-Algorithm: RS256) - Use o cabeçalho X-SHA256-Checksum para comunicar o valor de hash SHA256 do conteúdo (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Use o cabeçalho X-Encryption-Algorithm para comunicar o tipo de criptografia de conteúdo (
X-Encryption-Algorithm: A128CBC-HS256)
- Consistente (evite surpresas sendo previsível)
- Coeso (lista apenas endpoints com dependência funcional)
- Completo (possui todos os endpoints necessários para sua finalidade)
- Mínimo (sem mais endpoints do que o necessário para ser completo, sem recursos)
- Encapsulamento (ocultando detalhes de implementação)
- Autoexplicativo
- Documentado (se a autoexplicação não for suficiente)
- WSO2
- Apigee
- IBM
- Software AG
- Mulesoft
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)