Padrão Rest

56 views
Skip to first unread message

Jonas Nepomuceno

unread,
May 31, 2012, 2:53:56 PM5/31/12
to caelum-vraptor
Dúvida

Estou fazendo as coisas aqui obedecendo o padrão REST meu link para
apresentar uma
noticia fica da seguinte forma

http://10.10.10.10:8080/site/noticia/20045

Recurso = noticia
id da noticia= 20045

Mas acho interessante como esses sites de notícias fazem.
Exemplo globo, uol etc

http://g1.globo.com/politica/noticia/2012/05/demostenes-fica-calado-e-cpi-encerra-sessao-de-depoimento.html

Recurso = noticia
data = 2012/05
nome da noticia = demostenes-fica-calado-e-cpi-encerra-sessao-de-
depoimento.html

Como fazer isso ?
como colocar o nome da notícia como se fosse nome da página que eu não
sei se é, e nem o id
da notícia aparecer na URL, ou seja, dessa forma ai fica muito
amigável

de Já obrigado..

guilherme bueno

unread,
May 31, 2012, 2:59:20 PM5/31/12
to caelum-...@googlegroups.com
Jonas,

É só interpretar o "demostenes-fica-calado-e-cpi-encerra-sessao-de-depoimento.html" como um identificador único da página, ou seja isto também é um id. 
Ou seja, altere seu controller, remodele sua entidade e busque por um atributo que tenha o "ID" mais amigável como este.


Att.


Guilherme


--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
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.


Bruno Fuster

unread,
May 31, 2012, 3:04:06 PM5/31/12
to caelum-...@googlegroups.com
Opa

Aconselho a cada criação da noticia você criar uma chave [A-Za-z0-9] com replace de espaço por traço a partir do nome da noticia. 

Você pode fazer uma chave composta (key da noticia + data). 
Ai voce pode atender no @Path("/noticia/{date}/{key}")

Repare também que alguns portais não utilizam isso como chave mas fazem "noticia-qualquer/20913120931", então voce pode por qualquer URL descritiva para aquela noticia.

Faça também um replace de acentos com um normalizer:

public String deAccent(String str) {
   
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
   
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
   
return pattern.matcher(nfdNormalizedString).replaceAll("");
}
Source: http://stackoverflow.com/questions/1008802/converting-symbols-accent-letters-to-english-alphabet
2012/5/31 Jonas Nepomuceno <jon...@gmail.com>
--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
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.




--
Bruno Fuster

Lucas Cavalcanti

unread,
May 31, 2012, 3:05:15 PM5/31/12
to caelum-...@googlegroups.com
use algo do tipo:

@Get("/noticia/{nomeNoticia}")
public void mostra(String nomeNoticia) {
      Noticia noticia = dao.buscaPor(nomeNoticia);
      //....
}

2012/5/31 Jonas Nepomuceno <jon...@gmail.com>

Jonas Nepomuceno

unread,
May 31, 2012, 3:31:36 PM5/31/12
to caelum-vraptor
Pessoal que já fez de fato isso ?
Essas sugestões é de quem já fez ? ou de como vcs acham q seja o
funcionamento ?
acho q criar uma pk só para isso é muito cansativo, imagino q deve
existir alguma outra forma.


Lucas quando vc fala

@Get("/noticia/{nomeNoticia}")
public void mostra(String nomeNoticia) {
Noticia noticia = dao.buscaPor(nomeNoticia);
//....

}

a nomeNoticia seria o id ?

Eu pensava em algo do tipo, pegar o titulo da notícia enviar ele na
URL mas só para efeito de visual mesmo, ele de fato não teria nenhum
sentido para sistema
e implicitamente iria o pk da notícia, daí minha dúvida como eles
pegam o id ?
ou será se o nome mais a data representa a chave primaria da notícia,
que seria o id ?






On 31 maio, 16:05, Lucas Cavalcanti <lucasmrtu...@gmail.com> wrote:
> use algo do tipo:
>
> @Get("/noticia/{nomeNoticia}")
> public void mostra(String nomeNoticia) {
>       Noticia noticia = dao.buscaPor(nomeNoticia);
>       //....
>
> }
>
> 2012/5/31 Jonas Nepomuceno <jona...@gmail.com>
>
>
>
>
>
>
>
> > Dúvida
>
> > Estou fazendo as coisas aqui obedecendo o padrão REST meu link para
> > apresentar uma
> > noticia fica da seguinte forma
>
> >http://10.10.10.10:8080/site/noticia/20045
>
> > Recurso = noticia
> > id da noticia= 20045
>
> > Mas acho interessante como esses sites de notícias fazem.
> > Exemplo globo, uol etc
>
> >http://g1.globo.com/politica/noticia/2012/05/demostenes-fica-calado-e...

Bruno Fuster

unread,
May 31, 2012, 3:53:38 PM5/31/12
to caelum-...@googlegroups.com
Opa Jonas

Trabalho no iG e aqui os arquivos são estáticos e quando você acessa não existe consulta ao banco (a não ser em casos dinâmicos como busca, etc).

Essa dica de ter um campo unique é para o seu caso que é dinâmico e precisa recuperar do DB sem publicação estática. Não precisa de uma PK, apenas um campo unique, a PK continua o seu ID.

Você também pode mascarar isso como o Terra faz, por exemplo na URL:

 
Você pode trocar a descrição e o que importa é o ID...
Essa outra URL vai cair na mesma noticia: 



Abs

2012/5/31 Jonas Nepomuceno <jon...@gmail.com>



--
Bruno Fuster

Washington Botelho

unread,
May 31, 2012, 3:52:59 PM5/31/12
to caelum-...@googlegroups.com
Oi Jonas,

Tente alterar essa parte da URL das notícias e muito delas não quebrarão o link, pois essa parte fica sendo apenas para indexação.
Isso se consegue assim com o VRaptor:

@Get("/noticia/${noticia.id}/{titulo:[a-zA-Z]{0,}}")
public void noticia(Noticia noticia, String titulo) {
    System.out.println("Notícia: " + titulo);
}

Assim você terá um identificador, como o ID, porém o restante da URL seria apenas um texto qualquer.
Só me parece que o VRaptor tem um probleminha, no qual é obrigado a especificar o tamanho, então o jeito é fazer {0,}
Se a intenção realmente linkar pelo nome da integra e usá-lo, então faz igual o Lucas falou.

--
Washington Botelho

@wbotelhos
wbotelhos.com.br





2012/5/31 Jonas Nepomuceno <jon...@gmail.com>

Jonas Nepomuceno

unread,
May 31, 2012, 4:08:50 PM5/31/12
to caelum-...@googlegroups.com
Obrigado pessoal, Wbotelhos.com.br, de que tamanho vc fala ?
--
São Paulo Realmente é aquilo que

Washington Botelho

unread,
May 31, 2012, 4:15:13 PM5/31/12
to caelum-...@googlegroups.com
Tamanho do resultado do matcher da regex, só usar como passei: {0,}

Jonas Nepomuceno

unread,
May 31, 2012, 4:18:27 PM5/31/12
to caelum-...@googlegroups.com
obrigado

Tiago Oliveira

unread,
May 31, 2012, 7:37:09 PM5/31/12
to caelum-...@googlegroups.com
Fiz algo parecido em dois projetos (ambos de portais de notícias). Segue um snippet do mais recente:

link gerado:
http://paraibatotal.com.br/noticias/2012/05/31/52223-porto-recebe-carga-de-petroleo-verde 

e no controller:
@Get("/noticias/{ano}/{mes}/{dia}/{anchor}")
public void noticia(Integer ano,Integer mes,Integer dia,String anchor) {
Noticia noticia = noticiaService.findByAnchor(anchor);

if (noticia == null) {
result.use(Results.http()).sendError(404);
return;
}

...
}

 o ano mes dia a gente usava para gerar outras coisitas, mas o anchor era o que importava. Note o numero aleátorio antes do inicio do niceName, fizemos isso para evitar colisão no banco (anchor é unique, não PK).

Jonas Nepomuceno

unread,
Jun 1, 2012, 7:39:48 AM6/1/12
to caelum-...@googlegroups.com
http://paraibatotal.com.br/noticias/2012/05/31/52223-porto-recebe-carga-de-petroleo-verde

Esse numero 52223 é um numero aleatório que vcs geram ? esse numero
junto com o nome da noticia forma um campo UNIQUE.

DE JÁ OBRIGADO -

Exite como eu pegar o ID no caso a chave primaria da noticia sem
passar ela de forma explicita na URL, e o vraptor setar isso para mim
implicitamente ? assim
como ele seta um bean implicitamente na hora de um cadastro por exemplo.

Usando seu exemplo seria assim:

http://paraibatotal.com.br/noticias/2012/05/31/porto-recebe-carga-de-petroleo-verde

@Get("/noticias/{ano}/{mes}/{dia}/{anchor}")
>> public void noticia(Log ID) {
>> Noticia noticia = noticiaService.findByAnchor(ID);

Onde na verdade nessa URL bem formada, o que me importa é só o ID

Washington Botelho

unread,
Jun 1, 2012, 8:59:23 AM6/1/12
to caelum-...@googlegroups.com
Jonas,

Se você passa só estes dados e é via GET, só estes dados existirão.
Então é só você ter uma coluna no seu banco de dados chamada anchor.
Esta coluna terá os valores:

porto-recebe-carga-de-petroleo-verde
lucas-da-exemplo-com-bolinha
o-botelho-eh-bonito

Esta coluna sua tem que ser unique, pois se tiver dois valores iguais serão dois resultados para a mesma URL.
Você tem a opção de deixar a data só por deixar ou também fazer uma consulta com os valores da data: 2012/06/01.
Data esta que deveria ser convertida para date e também consultada no banco, neste caso ficaria.

from Noticia where date = '2012-06-01' and anchor = 'porto-recebe-carga-de-petroleo-verde'


--
Washington Botelho

@wbotelhos
wbotelhos.com.br





2012/6/1 Jonas Nepomuceno <jon...@gmail.com>
Reply all
Reply to author
Forward
0 new messages