• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

fnds

Protocolo HTTP, URL... (Duvidas)

21 mensagens neste tópico

Boas, vou usar este tópico para exclarecer as minhas duvidas relacionadas com este protocolo e relacionados.

Não me mander ir ler as especificações que eu já estou farto... Tentem ajudar :P

As primeiras são sobre as query strings...

Um dos caracteres reservados nas URL é o ";", para que serve?

Se eu enviar esta query (?a=b;c&d=e) para o servidor o que é suposto ele "recolher", {"a": "b;c", "d":"e"}, {"a": "b", "d":"e"} ou outra?

Se eu repetir o mesmo elemento na query (?a=b&c=d&a=e) o servidor deve de associar a chave ao ultimo valor ou a todo? ("a":"e" ou "a":["b","e"])

Cumps, fnds

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

The characters ";","/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme. No other characters may be reserved within a scheme.

Até hoje nunca vi esse carácter ser aplicado em nenhum esquema de URL

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e qual a dúvida? não identificas claramente os pares nome/valor?

A duvida é:

Se eu enviar esta query (?a=b;c&d=e) para o servidor o que é suposto ele "recolher", {"a": "b;c", "d":"e"}, {"a": "b", "d":"e"} ou outra?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso só testando, mas para mim é um url mal construido

a:b

c:nada

d:e

faz o teste a ver o que o server recebe!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que tive a ler agora na wikipedia, o ; é equivalente ao &, mas duvido que possas usar os 2 na mesma query string. Mesmo que seja válido usares, isso vai ser interpretado como {'a': 'b;c', 'd': 'e'} porque para ser um novo elemento tens que usar obrigatoriamente o =. Se queres passar uma variavel vazia, fazes ?a=b&c=&d=e que dá {'a': 'b', 'c': None, 'd': 'e'}. Em relação a repetições, não sei o resultado, mas o que estás a sugerir só acontece se usares ?a[]=b&c=d&a[]=e que vai dar {'a': ['b', 'e'], 'c': 'd'}. Claro está, isto só é válido se o parsing que estás a usar em Python para a query string for igual ao de PHP (que deve ser), porque o formato de uma query string não está bem definido. Pelo que podes ver aqui http://en.wikipedia.org/wiki/Query_string#RFC , diz-se que a query string é tudo o que vem depois do ? (embora já tenha visto exemplos em que se usa o :P e regra geral tem o formato key=value[;key=value] ou key=value[&key=value], mas não vejo isso definido em nenhum RFC nem nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem não estou esclarecido, porque não dá para estar, o standard é que não está grande coisa...

@djthyrax, o parsing é diferente, isso é suscitou as duvidas.. O PHP só repete se usar as [], enquanto que o modulo CGI do Python é tudo.

Para agradar a todos,

vou considerar o ";" como um elemento como outro qualquer, a interpretação do PHP.

e quanto à repetição vou usar uma mistura dos dois, uma string (quase) normal com o ultimo valor mas com um objecto extra que contem a listagem toda.

Outra questão, se enviar "?a=b&=c" devo de criar uma string vazia com o valor "c"?, ou isto também não está exclarecido?, mais uma vez o PHP faz uma coisa e o Python outra...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
B.2.2 Ampersands in URI attribute values

The URI that is constructed when a form is submitted may be used as an anchor-style link (e.g., the href attribute for the A element). Unfortunately, the use of the "&" character to separate form fields interacts with its use in SGML attribute values to delimit character entity references. For example, to use the URI "http://host/?x=1&y=2" as a linking URI, it must be written <A href="http://host/?x=1&y=2"> or <A href="http://host/?x=1&y=2">.

We recommend that HTTP server implementors, and in particular, CGI implementors support the use of ";" in place of "&" to save authors the trouble of escaping "&" characters in this manner.

@slack_guy, obrigado pelo link.

O "&" nas URLs não é HTML válido.

Por isso deve-se usar o ";" em vez do "&".

Para acabar, devo ignorar as strings que tenham um valor nulo, p.e. "?a=&b=c", "?a&b=c", "?=a&b=c"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a interpretar mal. O que eles dizem é para usares no source code http://host/?x=1&y=2 porque & é a entidade em HTML que simboliza o & (porque todas as entidades começam por &, daí a necessidade de usares o & para não haver confusão). Ou seja, para te referires ao URL http://host/?x=1&y=2 em (X)HTML tens de usar a entidade & para o &, ficando então http://host/?x=1&y=2.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra questão, se enviar "?a=b&=c" devo de criar uma string vazia com o valor "c"?, ou isto também não está exclarecido?, mais uma vez o PHP faz uma coisa e o Python outra...

O que é que o var_dump($_GET); deu nesse teste? Isso não é válido, pelo sugiro ignorares isso. Mas se isso não é opção, faz {'a': 'b', '': 'c'}.

PS: Aconselho-te a manteres a ordem dos argumentos na estrutura que vai guardar os dados da query string, pelo que usares um dict não é muito boa ideia porque ele não faz sort pela key mas sim pelo hash da key. Implementa um novo tipo onde consegues contornar isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a interpretar mal. O que eles dizem é para usares no source code http://host/?x=1&y=2 porque & é a entidade em HTML que simboliza o & (porque todas as entidades começam por &, daí a necessidade de usares o & para não haver confusão). Ou seja, para te referires ao URL http://host/?x=1&y=2 em (X)HTML tens de usar a entidade & para o &, ficando então http://host/?x=1&y=2.

Ah ok, então não tem anda a ver com isto... No entanto vou considerar os ";" como "&", se servem para a mesma coisa...

O que é que o var_dump($_GET); deu nesse teste? Isso não é válido, pelo sugiro ignorares isso. Mas se isso não é opção, faz {'a': 'b', '': 'c'}.

Vou ignorar. (Eu não vou pelo que o PHP faz, nada me garante que esteja correcto, e se fosse não tinha estas duvidas, simplesmente copiava :P).

No caso do "?a=&b=c" é que não sei se devo ignorar, por um lado quero, é mais facil validadar o formulário, só sendo necessário verificar se a chave existe, evita-se verificar se está vazia ou não. Mas por outro não, se ela está lá, mesmo vazia é por alguma coisa.

PS: Aconselho-te a manteres a ordem dos argumentos na estrutura que vai guardar os dados da query string, pelo que usares um dict não é muito boa ideia porque ele não faz sort pela key mas sim pelo hash da key. Implementa um novo tipo onde consegues contornar isso.

Porquê manter a ordem dos argumentos, isso importa?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah ok, então não tem anda a ver com isto... No entanto vou considerar os ";" como "&", se servem para a mesma coisa...

Eu não o faria, pelo simples facto que te vai tornar o parsing possivelmente mais complexo e porque é raro veres isso (eu próprio não vejo nada com isso, só documentos explicativos).

Vou ignorar. (Eu não vou pelo que o PHP faz, nada me garante que esteja correcto, e se fosse não tinha estas duvidas, simplesmente copiava :P).

Eu só queria saber a abordagem do PHP :D

No caso do "?a=&b=c" é que não sei se devo ignorar, por um lado quero, é mais facil validadar o formulário, só sendo necessário verificar se a chave existe, evita-se verificar se está vazia ou não. Mas por outro não, se ela está lá, mesmo vazia é por alguma coisa.

Não, não ignores, pelo menos se queres tornar isso uma library e não apenas parte da aplicação que estás a desenvolver agora. Pode-se usar isso para criar validações, sei lá, deixa isso ao critério dos utilizadores da tua library.
Porquê manter a ordem dos argumentos, isso importa?

Pode importar para validações, há pessoal para tudo. Como na resposta anterior, deixa isso ao critério dos teus utilizadores, isto é, se não te importares em teres o trabalho de escreveres uma meia dúzia de linhas de código.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não o faria, pelo simples facto que te vai tornar o parsing possivelmente mais complexo e porque é raro veres isso (eu próprio não vejo nada com isso, só documentos explicativos).

Eu não acho, basta um replace("&", ";"). E não posso ignorar, pode haver pessoal que queira usar o ";", eu até acho que fica mais bonito :P

De resto obrigado pelas dicas :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"a":"","x":"x"

É erro do programador, esses caracteres são reservados.

Ele devia de usar ou "?a=%3B;x=x" ou "?a=%26&x=x".

Como é que tu fazias, despresavas os ";" e ias contra as especificações?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há nenhuma especificação que te diga que a query string é um conjunto de pares chaves e valores unidos por & ou ;. Não há nada no RFC que define a constituição de um URI scheme que te diga isso. Eu desprezaria o ;.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora