4
respostas

Retorno do DELETE

Olá,

Criei o método DELETE exatamente como na video aula, o produto é removido porem o status code de retorno é 404. Alguma ideia do pq?

Code:

@Path("{id}/produtos/{idProduto}") public Response removeProduto(@PathParam("id") long id, @PathParam("idProduto") long idProduto){ Carrinho carrinho = carrinhoDAO.busca(id); carrinho.remove(idProduto); return Response.ok().build(); }

4 respostas

Olá Jonatas, tudo bem? 404 é o código que indica que a sua requisição não foi encontrada, provavelmente o problema é a URL que está sendo feita, ou seja, a URL pode estar errada. Pode mostrar todo o código? Também, teste mais uma vez com o curl usando a seguinte instrução:

curl -v -X DELETE http://localhost:8080/carrinhos/1/produtos/6237

Observe que o seu recurso precisa atender exatamente essa URL, portanto, carinhos/{id}/produtos/{idProduto}

Olá Jonatas, Geralmente este é exibido quando algo errado aconteceu durante sua requisição (o servidor não entendeu alguma coisa na sua URI e isso não deixou ela ser concluída com sucesso). Erro 404 é exibido geralmente em casos onde não cabe nenhuma outra resposta mais explicativa. Mais detalhes aqui : https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

Estou tendo o mesmo problema. Funcionou direitinho para o mesmo endereço nas aulas passadas, aliás, é só copiar e colar, logo, não pode ser erro de digitação (acreditem rsss) Desliguei o computador e quando fui fazer esse lab, pronto! Erro 404... :/

Segue o código do servidor:

package br.com.alura.loja;

import java.io.IOException; import java.net.URI;

import org.glassfish.grizzly.http.server.HttpServer; import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory; import org.glassfish.jersey.server.ResourceConfig;

public class Servidor { public static void main(String[] args) {

HttpServer server = inicializaServidor();

System.out.println("Server Running! Congrats!!!");

try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } server.stop(); }

public static HttpServer inicializaServidor() { URI uri=URI.create("http://localhost:8080/"); ResourceConfig config=new ResourceConfig().packages("br.com.alura.loja"); HttpServer server=GrizzlyHttpServerFactory.createHttpServer(uri, config); return server; }

}

Código do recurso: package br.com.alura.loja.resource;

import java.net.URI;

import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response;

import com.thoughtworks.xstream.XStream;

import br.com.alura.loja.dao.CarrinhoDAO; import br.com.alura.loja.modelo.Carrinho;

//significa /carrinhos @Path("carrinhos") public class CarrinhoResource {

@Path("{id}") //significa /id @GET //diz que o recurso será acessado via GET @Produces(MediaType.APPLICATION_XML)//diz que o que será produzido é um xml //@Produces(MediaType.APPLICATION_JSON)//diz que o que será produzido é json public String busca(@PathParam("id")long id){ Carrinho carrinho=new CarrinhoDAO().busca(id); return carrinho.toXML(); //return carrinho.toJson(); }

@POST //@Produces(MediaType.APPLICATION_XML)//removi porque na aula 6 não produzimos mais nada, e sim, //consumimos @Consumes(MediaType.APPLICATION_XML) public Response adiciona(String conteudo){ Carrinho carrinho=(Carrinho) new XStream().fromXML(conteudo); new CarrinhoDAO().adiciona(carrinho); URI uri=URI.create("/carrinhos/"+carrinho.getId()); return Response.created(uri).build(); }

@Path("{id}/produtos/{produtoId") @DELETE public Response removeProduto(@PathParam("id") long id, @PathParam("produtoId") long produtoId){ Carrinho carrinho=new CarrinhoDAO().remove(produtoId); carrinho.remove(produtoId); return Response.ok().build(); }

}

O erro 404 ocorre também quando é realizada uma requisição do tipo DELETE no seu caso por exemplo em um recurso que já foi removido do servidor. Ou seja, a requisição é completada, o recurso é invocado no seu servidor, porém quando a sua camada DAO vai fazer o dao.delete(id) não encontrará o recurso que pode lançar uma exceção ou não, depende da sua implementação. Pode ser que tenha também algum interceptador que possa estar encapsulando a exceção no servidor.