VRAPTOR - Anotar dois HTTP Methods em um recurso REST

8 respostas
vhmolinar

É possível anotar dois HTTP Method em um único método rest de uma Resource?
Eu tinha pensado em fazer algo assim

@Post
    @Put
    @Path("user/{token}/workspaces")
    public void saveOrUpdateWorkspace( String token, Workspace workspace )

Enviando um Post(application/x-www-form-urlencoded), deu tudo certo. O Vraptor me entregou os parâmetros corretamente; Embora ao tentar enviar um PUT com o mesmo content type para os parâmetros, o Vraptor só me entregou o primeiro deles, o token no caso.

O que estou fazendo de errado?
Isso é suportado pelo Framework?

8 Respostas

Lucas_Cavalcanti

qual servidor vc tá usando?

o tomcat, por exemplo, não parseia form parameters de requisições PUT por padrão, daí o VRaptor não consegue popular o objeto.

dá pra habilitar:
http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

conf parseBodyMethods

vhmolinar

Lucas, obrigado pela resposta.
Embora ainda não tenha conseguido fazer funcionar.

Sabe me dizer se essa configuração do connector funciona para todas subversões do tomcat7? Eu estou usando o tomcat “apache-tomcat-7.0.12”.

Deixei assim minha configuração:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" parseBodyMethods="POST,PUT"/>

Eu imagino que seja algum problema com essa minha atual versão do server.
Você usa essa configuração?

Lucas_Cavalcanti

talvez só funcione no tomcat 7… já usei essa configuração em alguns projetos

vhmolinar

Não rolou. Testei com outra versão do tomcat mas não recebo os valores do body.
Vo deixar só post mesmo.

Obrigado!

Lucas_Cavalcanti

a conf do parseBodyMethods não funcionou no tomcat 7?

deveria… vc editou no arquivo conf/server.xml?

se vc está no eclipse vc precisa editar esse arquivo no server do eclipse, não na pasta do tomcat.

vhmolinar

Sim. Eu fiz testes externos ao eclipse.

Coloquei a configuração no conf/server.xml,

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" parseBodyMethods="POST, PUT" />

Eu até encontrei a página do bug que referenciava essa implementação no bugzilla da apache. E era bem desse jeito aí que eu fiz mesmo.
Meu último teste foi na versão mais recente do gato tom: 7.0.29.

Como isso não é algo tão prioritário, acatei o uso do post mesmo.
Só é uma pena o fato de não poder implementar igualzinho no exemplo, http://vraptor.caelum.com.br/documentacao/resources-rest/ , hehe.

É só o tomcat que tem esse problema?
Valeu!
Valeu!

Lucas_Cavalcanti

não faz parte da especificação de servlets parsear requisições PUT, se eu não me engano… não cheguei a testar em outros servidores…

vhmolinar

Exato. Assim é dito na descrição da configuração:

“Note that any setting other than POST causes Tomcat to behave in a way that goes against the intent of the servlet specification”.

Acredito eu que exista uma certa discrepância entre a especificação do servlet e a especificação http, uma vez que nela não é dito que deva ser barrado put parameters do body.

Criado 7 de julho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 8
Participantes 2