Beruflich Dokumente
Kultur Dokumente
Novatec
Authorized Portuguese translation of the English edition of titled PHP Web Services, ISBN 9781449356569
2013 Lorna Jane Mitchell. This translation is published and sold by permission of O'Reilly Media, Inc.,
the owner of all rights to publish and sell the same.
Traduo em portugus autorizada da edio em ingls da obra PHP Web Services, ISBN 9781449356569
2013 Lorna Jane Mitchell. Esta traduo publicada e vendida com a permisso da O'Reilly Media,
Inc., detentora de todos os direitos para publicao e venda desta obra.
Novatec Editora Ltda. [2013].
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. proibida a reproduo
desta obra, mesmo parcial, por qualquer processo, sem prvia autorizao, por escrito, do autor e da
Editora.
Editor: Rubens Prates
Traduo: Lcia Ayako Kinoshita
Reviso tcnica: Aurelio Jargas
Reviso gramatical: Marta Almeida de S
Editorao eletrnica: Carolina Kuwabata
ISBN: 978-85-7522-369-7
Histrico de impresses:
Junho/2013
Primeira edio
captulo 1
HTTP
HTTP o acrnimo de HyperText Transfer Protocol (Protocolo de Transferncia de Hipertexto), e a base sobre a qual a web est construda.
Toda transao HTTP consiste em uma solicitao e uma resposta. O protocolo HTTP por si s composto de vrias partes: a URL para a qual a
solicitao foi direcionada, o verbo usado, outros cabealhos e cdigos
de status e, claro, o corpo das respostas, que o que geralmente vemos
quando navegamos pela web usando um navegador.
Ao navegar pela web, no plano ideal, experimentamos uma jornada tranquila, passando pelos vrios locais que queremos visitar. No entanto isso
representa um contraste marcante com o que est acontecendo por trs das
cortinas, medida que fazemos essa jornada. Ao prosseguirmos, clicando
em links ou fazendo o navegador criar solicitaes para ns, uma srie de
pequenos passos ocorre nos bastidores. Cada passo composto de um
par solicitao/resposta; o cliente (geralmente, seu navegador ou telefone,
se voc estiver navegando na web) faz uma solicitao ao servidor, e o
servidor processa a solicitao e envia a resposta de volta. A cada passo
ao longo do caminho, o cliente faz uma solicitao e o servidor envia a
resposta.
Como exemplo, insira o endereo http://oreilly.com/ em um navegador e voc
ver uma pgina semelhante quela mostrada na figura 1.1; as informaes desejadas podero ser encontradas na pgina, ou os hiperlinks nessa
pgina nos direcionaro para o caminho em direo a elas.
A pgina de web chega no corpo da resposta HTTP, mas ela conta somente parte da histria. O restante est em outros locais no trfego HTTP.
Considere os exemplos a seguir.
14
Captulo 1 HTTP
15
Cabealho da solicitao:
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.8 (KHTML, like Gecko)
Chrome/23.0.1246.0 Safari/537.8
Host: oreilly.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cabealho da resposta:
HTTP/1.1 200 OK
Date: Thu, 15 Nov 2012 09:36:05 GMT
Server: Apache
Last-Modified: Thu, 15 Nov 2012 08:35:04 GMT
Accept-Ranges: bytes
Content-Length: 80554
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=14400
Expires: Thu, 15 Nov 2012 13:36:05 GMT
Vary: Accept-Encoding
16
2. O navegador segue a instruo de redirecionamento (sem confirmao do usurio; os navegadores redirecionam por padro), faz
uma solicitao para http://www.google.co.uk/ e recebe a pgina com a
caixa de pesquisas (Somente por diverso, veja o cdigo-fonte dessa
pgina. H muita coisa acontecendo!). Ns preenchemos o campo
e acionamos a pesquisa.
Na histria mostrada aqui, todas as solicitaes foram feitas pelo navegador, em resposta a aes do usurio, embora algumas ocorram nos bastidores, tais como seguir os redirecionamentos ou solicitar componentes
adicionais. Todos os componentes de uma pgina, como imagens, folhas
de estilo e outros, so acessados por meio de solicitaes separadas, tratadas por um servidor. Qualquer contedo carregado assincronamente
(pelo JavaScript, por exemplo) tambm gera mais solicitaes. Quando
trabalhamos com APIs, ns nos aproximamos mais das solicitaes e as
fazemos de modo mais deliberado, mas os mecanismos so os mesmos
que usamos para criar pginas de web bem bsicas. Se voc j estiver
criando sites, ento j deve conhecer tudo o que necessrio para criar
web services!
Captulo 1 HTTP
17
Clientes e servidores
Anteriormente, neste captulo, falamos sobre uma solicitao e uma resposta entre um cliente e um servidor. Quando criamos sites usando PHP,
a parte em PHP sempre corresponde ao servidor. Quando usamos APIs,
construmos o servidor em PHP, mas podemos tambm consumir APIs
a partir do PHP. aqui que a situao comea a ficar confusa. Podemos
criar tanto um cliente quanto um servidor em PHP, e as solicitaes e as
respostas podem ser tanto de entrada quanto de sada ou ambas!
Quando construmos um servidor, seguimos padres semelhantes
maneira pela qual criamos pginas de web. Quando uma solicitao
chega, usamos o PHP para descobrir o que foi solicitado e elaboramos
a resposta correta. Por exemplo, se desenvolvssemos uma API para que
os clientes pudessem obter atualizaes sobre seus pedidos de maneira
programtica, estaramos construindo um servidor.
Usar o PHP para consumir APIs significa que estamos criando um cliente.
Nosso aplicativo PHP faz solicitaes a servios externos via HTTP e,
ento, usa as respostas para seus prprios propsitos. Um exemplo de
um cliente poderia ser uma pgina que busca seus tutes mais recentes
e os apresenta.
No incomum que um aplicativo seja ambos, um cliente e um servidor,
conforme mostrado na figura 1.2. Um aplicativo que aceite uma solicitao
e, em seguida, chame outros servios para obter as informaes de que
necessita para gerar a resposta estar atuando tanto como cliente quanto
como servidor.
Figura 1.2 Aplicativo da web atuando como um servidor para o usurio, mas tambm
como cliente para acessar outras APIs.
18
Curl
O Curl uma ferramenta de linha de comando disponvel em todas as
plataformas. Ele nos permite fazer qualquer solicitao imaginvel de web
em qualquer formato, repetir essas solicitaes e observar, com detalhes,
quais informaes, exatamente, so trocadas entre cliente e servidor. Com
efeito, a sada de exemplo no incio deste captulo foi gerada pelo Curl.
uma ferramenta brilhante e rpida para inspecionar o que est acontecendo com uma solicitao web, particularmente quando lidamos com
aquelas que esto fora do escopo usual de um navegador.
Captulo 1 HTTP
19
Em sua forma mais bsica, uma solicitao Curl pode ser feita desta
maneira (substitua as URLs pelas suas):
curl http://requestb.in/example
Existem algumas opes teis que podem ser usadas para obter mais informaes do Curl, alm do corpo da resposta. Experimente usar a opo
v, pois ela mostrar de tudo: cabealhos das solicitaes, cabealhos das
respostas e todo o corpo da resposta! Porm ela divide a resposta, enviando as informaes de cabealho para STDERR e o corpo para STDOUT.
Se a resposta for razoavelmente extensa, poder ser difcil encontrar uma
determinada informao quando estiver usando Curl. Para ajudar nesse
caso, possvel combinar o Curl com outras ferramentas, como o less ou
o grep; contudo o Curl mostra uma barra de progresso na sada quando
est em operao normal, o que pode causar confuso para essas outras
ferramentas. Para inibir a barra de progresso, utilize a opo s (mas
tome cuidado, pois ela tambm inibe a apresentao dos erros do Curl).
Pode ser produtivo usar -s em combinao com v para criar uma sada
que possa ser enviada a um paginador, como o less, para que ela possa
ser examinada de modo detalhado, por meio de um comando como este:
curl -s -v http://requestb.in/example 2>&1 | less
O 2>&1 extra est presente para enviar a sada de STDERR para STDOUT,
de modo que voc possa ver os cabealhos e o corpo; por padro, somente
o STDOUT seria visvel ao less.
Trabalhar com a web em geral, e com APIs em particular, significa trabalhar com dados. O Curl nos permite fazer isso de algumas maneiras
20
Antes de passar do Curl para outras ferramentas, vamos dar uma olhada
em mais um recurso: como lidar com cookies. Os cookies sero discutidos
com mais detalhes em um captulo posterior, mas, por enquanto, importante saber que os cookies so armazenados pelo cliente e enviados com
as solicitaes, e que novos cookies podem ser recebidos juntamente com
Captulo 1 HTTP
21
A essa altura, cookiejar.txt pode ser alterado da maneira que voc julgar
adequada (novamente, nunca confie em informaes provenientes de fora
do aplicativo!) e, em seguida, enviado ao servidor com a prxima solicitao que voc fizer. Para isso, use a opo b e especifique o arquivo no
qual os cookies podero ser encontrados:
curl -b cookiejar.txt http://requestb.in/example
22
as solicitaes feitas pelo seu navegador: o LiveHTTPHeaders (http://livehttpheaders.mozdev.org/). Ao us-lo, podemos observar todos os detalhes
de cada solicitao, conforme pode ser visto na figura 1.3.
Captulo 1 HTTP
23
PHP
No de se surpreender que haja mais de uma maneira de lidar com solicitaes HTTP usando PHP, e cada um dos frameworks tambm oferece
suas prprias contribuies. Esta seo est focada no PHP bsico e analisa
trs diferentes maneiras de trabalhar com APIs: usando a extenso Curl
que j vem com o PHP, usando a extenso pecl_http e fazendo chamadas
HTTP usando o tratamento de streams do PHP.
Anteriormente neste captulo, discutimos uma ferramenta de linha de
comando chamada Curl (veja Curl na pgina 18). O PHP possui seus
prprios wrappers (empacotadores) para o Curl, portanto podemos usar
a mesma ferramenta de dentro do PHP. Uma solicitao GET simples tem
o seguinte aspecto:
<?php
$url = "http://oreilly.com";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
24
Captulo 1 HTTP
25
<?php
$url = "http://requestb.in/example";
$data = array("name" => "Lorna", "email" => "lorna@example.com");
$request = new HTTPRequest($url, HTTP_METH_POST);
$request->setPostFields($data);
$request->setHeaders(array("Content-Type" => "application/json"));
$request->send();
$result = $request->getResponseBody();
Podemos tirar vantagens do fato de o PHP conseguir lidar com uma variedade de protocolos diferentes (HTTP, FTP, SSL e outros) e com arquivos usando streams. As solicitaes GET simples so fceis, mas e quando
houver algo mais complicado? Aqui est um exemplo que faz a mesma
solicitao POST com cabealhos, ilustrando como usar vrios aspectos da
funcionalidade de streams:
<?php
$url = "http://requestb.in/example";
$data = array("name" => "Lorna", "email" => "lorna@example.com");
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
26
As opes so definidas como parte do contexto que criamos para determinar como a solicitao dever funcionar. Em seguida, quando o PHP
abrir o stream, ele usar as informaes fornecidas para determinar como
lidar corretamente com o stream incluindo enviar os dados fornecidos
e definir os cabealhos corretos.
Como voc pode observar, h algumas opes diferentes para lidar com
o HTTP, tanto a partir do PHP quanto da linha de comando, e voc ver
todas elas sendo usadas ao longo deste livro. Todas essas abordagens
esto voltadas para o PHP padro, mas se voc estiver trabalhando com
um framework, provavelmente ele ir oferecer algumas funcionalidades
parecidas; todos os frameworks estaro encapsulando um desses mtodos, portanto ser til ter um bom domnio do que est acontecendo
por dentro desses encapsulamentos. Aps experimentar vrios exemplos,
comum eleger um com o qual voc trabalhar mais do que com os
demais; todos eles podem executar a mesma tarefa, de modo que aquele
que voc eleger ser o resultado tanto de sua preferncia pessoal quanto
das ferramentas que estiverem disponveis (ou que podem se tornar disponveis) em sua plataforma.