Provavelmente será uma pergunta estúpida, mas estou tendo uma daquelas noites. Em um aplicativo, estou desenvolvendo a API RESTful e queremos que o cliente envie dados como JSON. Parte desse aplicativo requer que o cliente faça upload de um arquivo (geralmente uma imagem), além de informações sobre a imagem.
Estou com dificuldade para rastrear como isso acontece em uma única solicitação. É possível Base64 os dados do arquivo em uma string JSON? Vou precisar executar 2 postagens no servidor? Não devo usar o JSON para isso?
Como uma observação lateral, estamos usando o Grails no back-end e esses serviços são acessados por clientes móveis nativos (iPhone, Android, etc.), se isso faz alguma diferença.
json
rest
grails
file-upload
Gregg
fonte
fonte
Respostas:
Fiz uma pergunta semelhante aqui:
Como faço para enviar um arquivo com metadados usando um serviço da web REST?
Você basicamente tem três opções:
multipart/form-data
POST e retorne um ID para o cliente. O cliente envia os metadados com o ID e o servidor associa novamente o arquivo e os metadados.fonte
Você pode enviar o arquivo e os dados em uma solicitação usando o tipo de conteúdo multipart / form-data :
Em http://www.faqs.org/rfcs/rfc2388.html :
Você pode incluir informações de arquivo ou campo em cada seção entre limites. Eu implementei com sucesso um serviço RESTful que exigia que o usuário enviasse dados e um formulário, e os dados de várias partes / formulário funcionavam perfeitamente. O serviço foi construído usando Java / Spring e o cliente estava usando C #, então, infelizmente, não tenho exemplos do Grails para dar a você sobre como configurar o serviço. Você não precisa usar JSON nesse caso, pois cada seção "form-data" fornece um local para especificar o nome do parâmetro e seu valor.
A coisa boa sobre o uso de dados de várias partes / formulário é que você está usando cabeçalhos definidos por HTTP; portanto, segue a filosofia REST de usar as ferramentas HTTP existentes para criar seu serviço.
fonte
Eu sei que este segmento é bastante antigo, no entanto, estou faltando aqui uma opção. Se você possui metadados (em qualquer formato) que deseja enviar juntamente com os dados a serem enviados, é possível fazer uma única
multipart/related
solicitação.Você pode verificar a especificação RFC 2387 para obter detalhes mais detalhados.
Basicamente, cada parte dessa solicitação pode ter conteúdo de tipo diferente e todas as partes estão de alguma forma relacionadas (por exemplo, uma imagem e seus metadados). As partes são identificadas por uma cadeia de fronteira e a cadeia de fronteira final é seguida por dois hífens.
Exemplo:
fonte
Sei que essa pergunta é antiga, mas nos últimos dias eu havia pesquisado na Web inteira para solucionar essa mesma pergunta. Tenho serviços web REST grails e iPhone Client que enviam fotos, título e descrição.
Não sei se minha abordagem é a melhor, mas é tão fácil e simples.
Eu tiro uma foto usando o UIImagePickerController e envio ao servidor o NSData usando as tags de cabeçalho de solicitação para enviar os dados da imagem.
No lado do servidor, recebo a foto usando o código:
Não sei se tenho problemas no futuro, mas agora está funcionando bem no ambiente de produção.
fonte
Aqui está minha API de abordagem (eu uso o exemplo) - como você pode ver, você não usa nenhum
file_id
(identificador de arquivo carregado no servidor) na API:Crie um
photo
objeto no servidor:Carregar arquivo (observe que
file
está no formato singular porque é apenas um por foto):E então, por exemplo:
Leia a lista de fotos
Leia alguns detalhes da foto
Ler arquivo de foto
Portanto, a conclusão é que, primeiro você cria um objeto (foto) pelo POST e depois envia a segunda solicitação com o arquivo (novamente POST).
fonte
Objetos FormData: Carregar arquivos usando o Ajax
XMLHttpRequest Nível 2 adiciona suporte para a nova interface FormData. Os objetos FormData fornecem uma maneira de construir facilmente um conjunto de pares de chave / valor representando os campos do formulário e seus valores, que podem ser facilmente enviados usando o método XMLHttpRequest send ().
https://developer.mozilla.org/en-US/docs/Web/API/FormData
fonte
Como o único exemplo que falta é o exemplo do ANDROID , vou adicioná-lo. Essa técnica usa um AsyncTask personalizado que deve ser declarado dentro da sua classe Activity.
Então, quando você quiser enviar seu arquivo, basta ligar para:
fonte
Eu queria enviar algumas strings para o servidor back-end. Eu não usei o json com multipart, usei parâmetros de solicitação.
O URL pareceria
Estou passando dois parâmetros (uuid e tipo) junto com o upload do arquivo. Espero que isso ajude quem não possui os dados complexos do json para enviar.
fonte
Você pode tentar usar a https://square.github.io/okhttp/ library. Você pode definir o corpo da solicitação como multipart e adicionar os objetos file e json separadamente da seguinte maneira:
fonte
fonte
Verifique se você tem a seguinte importação. Claro que outras importações padrão
fonte
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String