Estamos desenvolvendo servidor com API REST, que aceita e responde com JSON. O problema é que, se você precisar fazer upload de imagens do cliente para o servidor.
Nota: e também estou falando de um caso de uso em que a entidade (usuário) pode ter vários arquivos (carPhoto, licensePhoto) e também ter outras propriedades (nome, email ...), mas quando você cria um novo usuário, você não enviar essas imagens, elas são adicionadas após o processo de registro.
As soluções que eu conheço, mas cada uma delas tem algumas falhas
1. Use multipart / form-data em vez de JSON
good : as solicitações POST e PUT são o mais RESTful possível, elas podem conter entradas de texto junto com o arquivo.
contras : não é mais JSON, o que é muito mais fácil de testar, depurar etc. comparar com dados de várias partes / formulário
2. Permitir atualizar arquivos separados
A solicitação POST para criar novo usuário não permite adicionar imagens (o que é bom em nosso caso de uso, como eu disse no início), o upload de imagens é feito pela solicitação PUT como multipart / form-data para, por exemplo / users / 4 / carPhoto
good : tudo (exceto o arquivo que está sendo carregado) permanece em JSON, é fácil testar e depurar (você pode registrar solicitações JSON completas sem ter medo do tamanho)
contras : Não é intuitivo, você não pode POST ou PUT todas as variáveis da entidade de uma só vez e também esse endereço /users/4/carPhoto
pode ser considerado mais uma coleção (o caso de uso padrão da API REST se parece com isso /users/4/shipments
). Normalmente você não pode (e não quer) GET / PUT cada variável da entidade, por exemplo users / 4 / name. Você pode obter um nome com GET e alterá-lo com PUT em users / 4. Se houver algo após o ID, geralmente haverá outra coleção, como users / 4 / reviews
3. Use Base64
Envie-o como JSON, mas codifique arquivos com o Base64.
good : Igual à primeira solução, é o serviço RESTful possível.
contras : Mais uma vez, o teste e a depuração são muito piores (o corpo pode ter megabytes de dados), há um aumento no tamanho e também no tempo de processamento em ambos - cliente e servidor
Eu realmente gostaria de usar a solução não. 2, mas tem seus contras ... Qualquer pessoa pode me dar uma idéia melhor da solução "o que é melhor"?
Meu objetivo é ter serviços RESTful com o máximo possível de padrões incluídos, enquanto eu quero mantê-lo o mais simples possível.