Eu quero fazer uma pergunta sobre o multipart/form-data
. No cabeçalho HTTP, acho que o Content-Type: multipart/form-data; boundary=???
.
O conteúdo é ???
livre para ser definido pelo usuário? Ou é gerado a partir do HTML? É possível definir o ??? = abcdefg
?
Respostas:
Sim.
Não. O HTML não tem nada a ver com isso. Leia abaixo.
Sim.
Se você deseja enviar os seguintes dados para o servidor web:
usando
application/x-www-form-urlencoded
seria assim:Como você pode ver, o servidor sabe que os parâmetros são separados por um e comercial
&
. Se&
for necessário para um valor de parâmetro, ele deverá ser codificado.Então, como o servidor sabe onde um valor de parâmetro começa e termina quando recebe uma solicitação HTTP usando
multipart/form-data
?Usando o limite , semelhante a
&
.Por exemplo:
Nesse caso, o valor limite é
XXX
. Você o especifica noContent-Type
cabeçalho para que o servidor saiba como dividir os dados que recebe.Então você precisa:
Use um valor que não apareça nos dados HTTP enviados ao servidor.
Seja consistente e use o mesmo valor em qualquer lugar da mensagem de solicitação.
fonte
A resposta exata à pergunta é: sim, você pode usar um valor arbitrário para o
boundary
parâmetro , pois ele não excede 70 bytes de comprimento e consiste apenas em caracteres de 7 bitsUS-ASCII
(imprimíveis).Se você estiver usando um dos
multipart/*
tipos de conteúdo, precisará especificar oboundary
parâmetro noContent-Type
cabeçalho; caso contrário, o servidor (no caso de uma solicitação HTTP) não poderá analisar a carga útil.Você provavelmente também deseja definir o
charset
parâmetroUTF-8
no seuContent-Type
cabeçalho, a menos que tenha certeza absoluta de que apenas o conjunto deUS-ASCII
caracteres será usado nos dados da carga útil.Alguns trechos relevantes do RFC2046 :
4.1.2 Parâmetro Charset:
5.1 Tipo de mídia multipartes
Aqui está um exemplo usando um limite arbitrário:
fonte
multipart / form-data contém limite para separar pares nome / valor. O limite atua como um marcador de cada parte dos pares nome / valor passados quando um formulário é enviado. O limite é adicionado automaticamente ao tipo de conteúdo de um cabeçalho de solicitação.
O formulário com o atributo enctype = "multipart / form-data" terá um cabeçalho de solicitação Content-Type: multipart / form-data; limite --- WebKit193844043-h ( vaue gerado pelo navegador ).
A carga útil passada é mais ou menos assim:
No lado do serviço da web, é consumido no formato @Consumes ("multipart / form-data").
Cuidado, ao testar seu serviço da web usando o chrome postman, você precisa verificar a opção de dados do formulário (botão de opção) e o menu Arquivo na caixa suspensa para enviar o anexo. O fornecimento explícito de tipo de conteúdo como dados de várias partes / formulário gera um erro. Como o limite está ausente, ele substitui a solicitação de ondulação do postman no servidor com o tipo de conteúdo, acrescentando o limite que funciona bem.
Consulte RFC1341 sec7.2 O tipo de conteúdo de várias partes
fonte