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


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--

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.