REST - HTTP Post multipart com JSON

88

Preciso receber um HTTP Post Multipart que contém apenas 2 parâmetros:

  • Uma string JSON
  • Um arquivo binário

Qual a forma correta de definir o corpo? Vou testar a chamada HTTP usando o console REST do Chrome, então estou me perguntando se a solução correta é definir uma chave de "rótulo" para o parâmetro JSON e o arquivo binário.

No lado do servidor, estou usando o Resteasy 2.x e vou ler o corpo do Multipart assim:

@POST
@Consumes("multipart/form-data")
public String postWithPhoto(MultipartFormDataInput  multiPart) {
  Map <String, List<InputPart>> params = multiPart.getFormDataMap();
  String myJson = params.get("myJsonName").get(0).getBodyAsString();
  InputPart imagePart = params.get("photo").get(0);
  //do whatever I need to do with my json and my photo
}

É este o caminho a percorrer? É correto recuperar minha string JSON usando a chave "myJsonName" que identifica essa disposição de conteúdo específica? Existe alguma outra maneira de receber esses 2 conteúdos em uma solicitação multiparte HTTP?

desde já, obrigado

thermz
fonte
1
Que tipo de recurso REST é esse? Como duas partes se relacionam no nível do recurso?
Na verdade, a maneira como lidamos com esse recurso não é totalmente RESTful porque a imagem é um "componente" do recurso em vez de outro recurso.
thermz

Respostas:

148

Se bem entendi, você deseja redigir uma solicitação multiparte manualmente a partir de um console HTTP / REST. O formato multiparte é simples; uma breve introdução pode ser encontrada nas especificações do HTML 4.01 . Você precisa criar um limite, que é uma string não encontrada no conteúdo, digamos HereGoes. Você define o cabeçalho da solicitação Content-Type: multipart/form-data; boundary=HereGoes. Então, este deve ser um corpo de solicitação válido:

--HereGoes
Content-Disposition: form-data; name="myJsonString"
Content-Type: application/json

{"foo": "bar"}
--HereGoes
Content-Disposition: form-data; name="photo"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<...JPEG content in base64...>
--HereGoes--
Vasiliy Faronov
fonte
Você também pode adicionar um anexo no soap-ui. Isso alivia a necessidade de passar no corpo da postagem real e no tipo de conteúdo.
Shane Lee
1
Existe uma maneira padronizada de definir o limite único?
andig
2
@andig Não tenho conhecimento de nenhum. Talvez você possa usar um UUID , mas isso não é necessariamente uma boa ideia. Normalmente, sua biblioteca HTTP deve cuidar disso para você.
Vasiliy Faronov
Se sabemos que temos apenas dados json e base64 na solicitação, algo como, \*por exemplo, não deveria funcionar como um limite? Não é permitido existir em json nem em base64.
DaedalusAlpha de
2
Por que usar base64 para codificar os dados JPEG? HTTP permite que você envie os bytes brutos.
Alexandre Blin