Erro no PUT - BIZARROOO!!!

184 views
Skip to first unread message

Ricardo Leite

unread,
Nov 23, 2012, 9:35:55 AM11/23/12
to caelum-...@googlegroups.com
Pessoal, estou perdendo dias tentando descobrir o que pode ser... se alguem puder me ajudar.. estou desenvolvendo um webservice com vraptor.. ta tudo ok, porém serviços com put não funciona redondo. Testei vários clients tipo httpclient , Restfulie e seque um exemplo que estou fazendo com o requests python, por ser bem enxuto e funciona segue abaixo o cliente depois o metodo no vraptor.

import requests
headers = {'Content-type': 'text/plain'}
peca = {"peca" : r""
             "<peca>
                   <processo>112012019513</processo>
              </peca>
        """}
r = requests.put(url, data=peca)
print r.text


abaixo meu método no vraptor,, simplesmente a string vem nula, quando é um post funciona corretamente,, e isso é só o inicio dos problemas, esse é um teste quebrado, pois esse put vou passar um multipart com um file.. QUE NÃO VAI NEM A PAU!!!


        @Put("/peca")
@Consumes(value={"text/plain", "application/x-www-form-urlencoded"})
public void atualizacaoDaPeca(String peca){
                // /A STRING PECA DEVERIA VIR PREENCHIDA.. NO POST FUNCIONA

System.out.println("teste");
}

Lucas Cavalcanti

unread,
Nov 23, 2012, 11:00:29 AM11/23/12
to caelum-...@googlegroups.com
se está indo como form parameters vc precisa habilitar o servidor pra parsear isso no PUT... no caso do tomcat tem uma propriedade parseBodyMethods que vc seta no server.xml e resolve isso

2012/11/23 Ricardo Leite <rican...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/4tEYBCPzzCcJ.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.

Rafael Ponte

unread,
Nov 23, 2012, 11:46:04 AM11/23/12
to caelum-...@googlegroups.com

Eu acho que ja tive este problema uma vez com ajax e PUT, foi no Tomcat - na pressa mudei pra POST e deixei de lado. Nao sabia que o servidores precisavam ser configurados para suportar form parameters.

Quaid outros metodos http tem esse problema, Lucas?

Lucas Cavalcanti

unread,
Nov 23, 2012, 12:00:40 PM11/23/12
to caelum-...@googlegroups.com
o tomcat só parseia body parameters em POSTs, por padrão, todos os outros ele ignora e só te dá o InputStream do body pra vc fazer o que quiser.

daí vc tem que usar aquela conf

2012/11/23 Rafael Ponte <rpo...@gmail.com>

Ricardo Leite

unread,
Nov 23, 2012, 12:27:04 PM11/23/12
to caelum-...@googlegroups.com
Lucas.. show.. funcionou perfeito com a configuração no tomcat, porém.... quando fui para o proximo teste que é passar tambem um file no put, ele não aceita, faz os dois parametros chegarem nulos... será que tem que configurar o header no put? ou no método do vraptor mudar algo???


obrigadão..

Ricardo

Lucas Cavalcanti

unread,
Nov 23, 2012, 12:30:43 PM11/23/12
to caelum-...@googlegroups.com
qdo tem file o content-type é diferente, neh...

para arquivos é melhor separar um put só pra ele, daí vc recebe direto o InputStream da requisição

2012/11/23 Ricardo Leite <rican...@gmail.com>

Ricardo Leite

unread,
Nov 23, 2012, 12:34:50 PM11/23/12
to caelum-...@googlegroups.com
Entendi.. mas vou precisar passar os dois.. exemplo: o conceito é mais ou menos esse, vou fazer um put de um documento do Lucas no server (documento já existe), então estou editando os metadados da pessoa lucas e substituindo o documento "imagem ou arquivo qualquer" dele, então tenho que passar dois parametros no Put, seria um xml de metadados e um arquivo... por isso a necessidade..

Quero explorar o conceito do Put, pois no Post funciona perfeitamente.

Ricardo

Lucas Cavalcanti

unread,
Nov 23, 2012, 12:37:36 PM11/23/12
to caelum-...@googlegroups.com
esse upload  funciona com POST?

2012/11/23 Ricardo Leite <rican...@gmail.com>

Ricardo Leite

unread,
Nov 23, 2012, 12:45:32 PM11/23/12
to caelum-...@googlegroups.com
Sim Lucas,, tudo que falei funciona no Post.. o problema é no PUT!!!,, fiz vários clients,, com httpclient, outro restfulie, e agora com requests python,, mas sempre no controler do vraptor vem nulo.. estou adicionando esses dois content type no header:
'Content-type:': 'multipart/form-data',
 'Content-type:':'application/octet-stream'

mas não vai de jeito nenhum..

Lucas Cavalcanti

unread,
Nov 23, 2012, 12:54:47 PM11/23/12
to caelum-...@googlegroups.com
precisa ver como vc tá mandando o corpo da requisição...

o formato do multipart/form-data é diferente... mas como vc diz que funciona com put, precisa procurar nas interwebs se o tomcat suporta isso de algum jeito... nesse ponto não sei se é o vraptor que tá barrando...

2012/11/23 Ricardo Leite <rican...@gmail.com>

Lucas Cavalcanti

unread,
Nov 23, 2012, 12:55:59 PM11/23/12
to caelum-...@googlegroups.com
receba a request no método e tente fazer ServletFileUpload.isMultipartContent(request);

veja se isso retorna true na requisição PUT

2012/11/23 Lucas Cavalcanti <lucasm...@gmail.com>

Ricardo Leite

unread,
Nov 23, 2012, 1:02:50 PM11/23/12
to caelum-...@googlegroups.com
Retornou false.. veja o método no controller

@Put("/peca")
//@Consumes(value={"multipart/form-data", "application/x-www-form-urlencoded"})
public void atualizacaoDaPeca(final UploadedFile arquivo){
if(ServletFileUpload.isMultipartContent(request)){
System.out.println(true);
}else{
System.out.println(false);
}
System.out.println(request.getMethod());
System.out.println(request.getContentType());
System.out.println(request.getAuthType());
System.out.println(request.getRequestURL());
System.out.println(request.getRequestURI());
System.out.println("teste");
}


Esse é o cliente usando requests python

import requests
files = {'arquivo': open('/opt/teste/0000260501879958.tif', 'rb')}
headers = {'Content-type:': 'multipart/form-data'}
data = {"peca" : r"""<peca>
    <processo>112012019513</processo>
</peca>  """}

r = requests.put(url, files=files, data=data, headers=headers)
print r.text






Em 23 de novembro de 2012 15:55, Lucas Cavalcanti <lucasm...@gmail.com> escreveu:
ServletFileUpload.isMultipartContent(request);

Lucas Cavalcanti

unread,
Nov 23, 2012, 1:05:26 PM11/23/12
to caelum-...@googlegroups.com
isso então o apache-commons upload é quem não suporta PUT... ele deve supor que todos os uploads vem via POST =(

provavelmente no POST vai retornar true =(

Ricardo Leite

unread,
Nov 23, 2012, 1:14:59 PM11/23/12
to caelum-...@googlegroups.com
Lucas,,  mudei no controller para post e o client para post e foi perfeitamente.. realmente deve ser algo no que voce falou.. caso saiba como contornar agradeço a força.. mesmo assim obrigadão..  É uma pena, pois para explorarmos bem o Rest temos que usar esse recurso.

Ricardo




2012/11/23 Lucas Cavalcanti <lucasm...@gmail.com>

Lucas Cavalcanti

unread,
Nov 23, 2012, 1:15:52 PM11/23/12
to caelum-...@googlegroups.com
vc sempre pode fazer o POST com _method=PUT

Ricardo Leite

unread,
Nov 23, 2012, 1:19:17 PM11/23/12
to caelum-...@googlegroups.com
Sim lucas,, mas não é por JSP,,  é um sever Rest com vraptor.. e os clientes só vão consumir os serviços via URIs, usando componentes que usam protocolo http... ou seja não haverá consumo por navegadores.. somente uris mesmo..






2012/11/23 Lucas Cavalcanti <lucasm...@gmail.com>

Lucas Cavalcanti

unread,
Nov 23, 2012, 1:29:14 PM11/23/12
to caelum-...@googlegroups.com
eu sei, entendi isso... POST tb é rest ;)

será que o PUT das bibliotecas que vc tá usando suportam o mulitpart/form-data?

tenta usar o PUT e no controller do vraptor imprimir o request.getInputStream() ou o request header Content-Length e ve se tem o tamanho do arquivo lah

2012/11/23 Ricardo Leite <rican...@gmail.com>

Ricardo Leite

unread,
Jan 22, 2013, 1:38:44 PM1/22/13
to caelum-...@googlegroups.com
Lucas,
  conseguir resolver put com uma entidade, porém, o put com um file não vai de jeito algum, você sabe o que  pode ser.

abraço

Ricardo Leite

unread,
Jan 22, 2013, 1:39:36 PM1/22/13
to caelum-...@googlegroups.com
Lucas,  o put já funciona passando uma entidade, porém o file não vai de jeito algum, você sabe o que pode ser?

abraço

Leonardo Wolter

unread,
Jan 22, 2013, 1:43:32 PM1/22/13
to caelum-...@googlegroups.com
Opa, Ricardo :D

Você tem o commons-fileupload.jar no seu classpath? Está usando Servlet3?

Abraço!
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/rp_EtMLg38oJ.

Ricardo Leite

unread,
Jan 22, 2013, 1:47:55 PM1/22/13
to caelum-...@googlegroups.com
Olá Leonardo,
  tenho sm o commons-fileupload, inclusive funciona normalmente no post, somente no put que não vai de jeito algum.. quanto ao servlet estou usando o servlet-api-2.5, uso o vraptor 3.4.1

se souber agradeço.

att,
Ricardo

Ricardo Leite

unread,
Jan 22, 2013, 1:49:58 PM1/22/13
to caelum-...@googlegroups.com
Olá Leonardo,
  tenho sm o commons-fileupload, inclusive funciona normalmente no post, somente no put que não vai de jeito algum.. quanto ao servlet estou usando o servlet-api-2.5, uso o vraptor 3.4.1

se souber agradeço.

att,
Ricardo

Em terça-feira, 22 de janeiro de 2013 16h43min32s UTC-2, Leonardo Wolter escreveu:

Lucas Cavalcanti

unread,
Jan 22, 2013, 1:49:50 PM1/22/13
to caelum-...@googlegroups.com
se for file e for multipart, vc precisa trocar o content-type pra multipart...



2013/1/22 Ricardo Leite <rican...@gmail.com>
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/PIBMibPaXzsJ.

Ricardo Leite

unread,
Jan 22, 2013, 1:57:31 PM1/22/13
to caelum-...@googlegroups.com
Lucas tudo bem?
    estou testando com um cliente em python "requests", você quis dizer que é para acrescentar ao cabeçalho um multipart? Reforçando que o cliente não usa form, segue o cliente:


import requests
import os
from pprint import pprint


DESENVOLVIMENTO = 'http://localhost:8080/medusa'
URL_EM_USO = DESENVOLVIMENTO

arquivo = r'/opt/python/QUALQUERCOISA.tif'
ARQUIVO = arquivo

files = {'file': open(ARQUIVO, 'rb')}


def PUT():
    r = requests.put(URL_EM_USO+'/peca/2',
                       files=files
                      )
    return r

r = PUT()


print(os.path.getsize(ARQUIVO))
print(r.status_code)
pprint(r.request.headers)
print
pprint(r.headers) 

Lucas Cavalcanti

unread,
Jan 22, 2013, 2:05:02 PM1/22/13
to caelum-...@googlegroups.com
Ricardo, pro servidor parsear direitinho o request, os Headers precisam estar setados corretamente...

o Content-Type de enviar arquivos é multipart/form-data

2013/1/22 Ricardo Leite <rican...@gmail.com>
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/XkFaoBqUPbwJ.

Ricardo Leite

unread,
Jan 23, 2013, 11:31:21 AM1/23/13
to caelum-...@googlegroups.com
Lucas, realmente não sei mais o que fazer!!!  Estou fazendo testes rodando a aplicação com o Jetty, continua vindo nulo o objeto.  No client coloquei multipart no content type e não foi.  Será que não existe como dar um put com arquivo?

abraço.

Lucas Cavalcanti

unread,
Jan 23, 2013, 12:24:48 PM1/23/13
to caelum-...@googlegroups.com
Se vc vai fazer isso via API, e não via browser, o mais fácil é mandar o arquivo no body, e receber no método do controller direto:

@Put("/abc")
public void meuMetodoDoController(HttpServletRequest request) {
    InputStream arquivo = request.getInputStream();
    // o arquivo completo está aí, só mexer com ele
}

2013/1/23 Ricardo Leite <rican...@gmail.com>
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/Kdinfn8CkfwJ.

Raphael Milani

unread,
Jan 23, 2013, 1:55:42 PM1/23/13
to caelum-...@googlegroups.com
Acredito que seria dessa forma:

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
HttpClient client = new HttpClient( );
        
// Create POST method
String weblintURL = "http://ats.nist.gov/cgi-bin/cgi.tcl/echo.cgi";
PostMethod method = new PostMethod( weblintURL );
File file = new File( "project.xml" );
method.setRequestBody( new FileInputStream( file ) );
method.setRequestContentLength( (int)file.length( ) );
// Execute and print response
client.executeMethod( method );
String response = method.getResponseBodyAsString( );
System.out.println( response );
method.releaseConnection( );

Ao invés de usar a classe PostMethod  use PutMethod 

Raphael Milani


2013/1/23 Daniel dos Santos Rocha <danielsa...@gmail.com>
Olá Lucas, trabalho junto com o Ricardo e também estou tentando resolver este problema que estão tratando..

A minha dúvida em relação a sua ultima postagem..
Como o Ricardo falou antes neste fórum estamos usando um Client em Python, mas vc conseguiria fazer um pequeno exemplo em Java de como mandaríamos o arquivo no Body do Put??
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/Nbyf4ozfVRoJ.

Ricardo Leite

unread,
Jan 23, 2013, 2:40:34 PM1/23/13
to caelum-...@googlegroups.com
Lucas,
  funcionou, porém, o arquivo salva corrompido porque dentro dele vem informação do content type e caminho do arquivo, essas informações não deveria estar dentro, como separar o file real dessas informações no request?

abração.
Ricardo






Em quarta-feira, 23 de janeiro de 2013 15h24min48s UTC-2, Lucas Cavalcanti escreveu:

Raphael Milani

unread,
Jan 23, 2013, 2:43:24 PM1/23/13
to caelum-...@googlegroups.com
Você precisa utilizar a API CommonsFileUpload para pegar somente o arquivo em bytes, acredito que resolverá 

Raphael Milani


2013/1/23 Ricardo Leite <rican...@gmail.com>
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/NVhlUOBdTWEJ.

Lucas Cavalcanti

unread,
Jan 23, 2013, 3:03:14 PM1/23/13
to caelum-...@googlegroups.com
Estranho... o request.getInputStream() deveria vir só com o body da requisição, não com os headers...


tenta fazer um request.getHeader("Content-type") antes de pedir o inputStream

2013/1/23 Raphael Milani <rami...@gmail.com>

Otávio Garcia

unread,
Jan 23, 2013, 4:38:48 PM1/23/13
to caelum-...@googlegroups.com
Na verdade o upload não é apenas o conteúdo, mas sim uma String que contém o contenttype, length, fieldname, e o conteúdo do arquivo em base64. Isso porque um upload pode ser até mesmo uma String, e não um arquivo.

É necessário fazer parse disso, e o commons-fileupload pode ajudar neste caso, fazendo parse desse Stream.

No final desta página tem uma explicação: http://www.w3.org/TR/html401/interact/forms.html

Abraço

2013/1/23 Lucas Cavalcanti <lucasm...@gmail.com>

Ricardo Leite

unread,
Jan 24, 2013, 8:32:10 AM1/24/13
to caelum-...@googlegroups.com
Lucas bom dia,
  estamos avançando com o common-file-upload, mas já podemos concluir que o vraptor não está sabendo tratar file no put???

abração,
Ricardo

Lucas Cavalcanti

unread,
Jan 24, 2013, 10:43:17 AM1/24/13
to caelum-...@googlegroups.com
a mesma requisição POST funciona?

2013/1/24 Ricardo Leite <rican...@gmail.com>
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/n2abe9K22YMJ.

Ricardo Leite

unread,
Jan 24, 2013, 10:55:34 AM1/24/13
to caelum-...@googlegroups.com
sim o Post funciona perfeitamente, somente no PUT que está esse problema.

Lucas Cavalcanti

unread,
Jan 24, 2013, 12:13:14 PM1/24/13
to caelum-...@googlegroups.com
se eu não me engano é problema com a commons-fileupload, que não parseia requisições PUT... tem um if perguntando se o request method é POST antes de fazer qqer coisa:

Ricardo Leite

unread,
Jan 24, 2013, 12:44:27 PM1/24/13
to caelum-...@googlegroups.com
Lucas,  será que tem como sobrescrever o método dentro do vratpor ?  Através de uma classe @ApplicationScoped,.... ?

Lucas Cavalcanti

unread,
Jan 24, 2013, 12:45:48 PM1/24/13
to caelum-...@googlegroups.com
vc pode sobrescrever o multipartInterceptor, cria uma classe anotada com @Component que estende esse CommonsUploadMultipartInterceptor e sobrescreve o accepts...

mas vc precisa retornar true só se o request for multipart.

2013/1/24 Ricardo Leite <rican...@gmail.com>
Reply all
Reply to author
Forward
0 new messages