Classe PHP Client A classe Zend\Http\Client fornece uma interface para realizar pedidos HTTP. O método send() é usado para submeter o pedido ao servidor remoto. Estes pedidos retornam um objeto Zend\Http\Response através do qual podemos ter acesso aos cabeçalhos e corpo da resposta. Exemplos: $client = new Client('http://example.org', array( 'maxredirects' => 0, 'timeout' => 30 Em alternativa pode-se usar o construtor sem argumentos e usar o método seturi() para fornecer o URL e o método setconfig() para fornecer as opções de configuração. $client = new Client(); $client->seturi('http://example.org'); $client->setoptions(array( 'maxredirects' => 0, 'timeout' => 30 Também é possível fazer pedidos usando um objeto Zend\Http\Request configurado: use Zend\Http\Request; $request = new Request(); $request->seturi('http://example.org'); $client = new Client(); $response = $client->send($request);
Efetuar um pedido GET O método do pedido pode ser configurado usando setmethod(). Se nenhum método é especificado, o método colocado pela última invocação de setmethod() é usado. Se setmethod() nunca foi invocado, o método do pedido por omissão é GET. $client = new Client('http://example.org'); Efetuar um pedido POST $client = new Client('http://example.org'); // Performing a POST request $client->setmethod('post'); Todos os métodos de pedidos HTTP estão definidos como constantes da classe Zend\Http\Request: Zend\Http\Request::METHOD_GET Zend\Http\Request::METHOD_POST... use Zend\Http\Request; $client = new Client('http://example.org'); // Performing a POST request $client->setmethod(request::method_post); Envio de parâmetros GET Os parâmetros podem ser especificados: como parte do URL, ou usando o método setparameterget() colocando os parâmetros como um array associativo $client = new Client(); // This is equivalent to setting a URL in the Client's constructor: $client->seturi('http://example.com/index.php?knight=lancelot'); // Adding several parameters with one call $client->setparameterget(array( 'first_name' => 'Bender', 'last_name' => 'Rodríguez', 'made_in' => 'Mexico',
Envio de parâmetros POST Os parâmetros POST só podem ser enviados no corpo de um pedido POST. São especificados usando o método setparameterpost() colocando os parâmetros como um array associativo. $client = new Client('http://example.org'); $client->setmethod('post'); // Setting several POST parameters, one of them with several values $client->setparameterpost(array( 'language' => 'es', 'country' => 'ar', 'selection' => array(45, 32, 80) Colocar cabeçalhos no Pedido A classe Client possui o método setheaders() para colocar cabeçalhos no pedido. Este método cria um novo contentor de cabeçalhos, adiciona os cabeçalhos especificados e coloca o contentor de cabeçalhos no objeto Request. $client->setmethod(request::method_post); $data = '... '; $len = strlen($data); $client->setheaders(array( 'Content-Type' => 'application/x-www-form-urlencoded', 'Content-Length' => $len Envio de dados raw num pedido POST Para enviar dados num pedido POST diferentes de form encoded data existe o método setrawbody(). Este método leva um parâmetro com os dados a enviar no corpo do pedido. Quando se envia dados POST raw deve-se colocar o tipo de encoding usando setenctype(). Exemplo: $xml = '<book>'. '<title>islands in the Stream</title>'. '<author>ernest Hemingway</author>'. '<year>1970</year>'. '</book>'; $client->setmethod('post'); $client->setrawbody($xml); $client->setenctype('text/xml'); $client->send(); Por omissão, Zend\Http\Client aceita e retorna dados como strings PHP. Exemplo: $data = '.. '; $client->setrawbody($data);
HTTP Client - Connection Adapters Um objeto Client usa um objeto connection adapter encarregado de efetuar a ligação ao servidor, escrever os pedidos e ler as respostas. O connection adapter usado por omissão é o Zend\Http\Client\Adapter\Socket, embora possa ser substituído por outros adapters. O adapter Socket permite várias opções de configuração através do método setoptions(). Exemplo: $client->setoptions(['sslverifypeer' => false]); Por omissão o parâmetro 'sslverifypeer' tem o valor TRUE o que significa que é necessário a verificação do certificado SSL usado. Ligação a um URL SSL: Login numa aplicação Asp.Net Web API 2 $client = new Client('https://localhost:44399/Token'); $client->setmethod(request::method_post); $data = "grant_type=password&username=$username&password=$password"; $len = strlen($data); $client->setheaders(array( 'Content-Type' => 'application/x-www-form-urlencoded', 'Content-Length' => $len $client->setoptions(['sslverifypeer' => false]); $client->setrawbody($data); if ($response->issuccess()) { $body = Json::decode($response->getBody( if(!empty($body->access_token)) { if(!isset($_session)){ session_start(); $_SESSION['access_token'] = $body->access_token; $_SESSION['username'] = $username; return true; else return false; else return false;
Classe Response A classe Zend\Http\Response permite ter acesso aos cabeçalhos e corpo da resposta. Alguns métodos: getheaders() retorna o contentor (objeto Zend\Http\Headers) responsável por guardar os cabeçalhos Http. issuccess() retorna um valor bool indicando o sucesso da resposta getcontent() obtém o conteúdo raw da mensagem getbody() obtém o conteúdo descodificado da mensagem
json_decode() - Converte arrays ou objetos JSON em arrays ou objetos PHP $var = json_decode(string $json) $var = json_decode(string $json, bool $assoc=false) json_decode recebe uma string codificada em JSON e converte-a numa variável PHP. Esta função só trabalha com strings codificadas em UTF-8. Se o parâmetro assoc é true, os objetos retornados são convertidos em arrays associativos. Tipicamente os dados JSON representam arrays ou objetos JavaScript e json_decode converte-os em arrays ou objetos PHP. Exemplo de conversão de arrays JSON para arrays PHP: $json = '["laranja", "banana", "morango"]'; $arr = json_decode($json); echo $arr[0]; // laranja Exemplo de conversão de objetos JSON para objetos PHP: $json = '{"titulo": "JavaScript: The Definitive Guide","autor": "David Flanagan", "edicao": 6' $livro = json_decode($json); echo $livro->titulo; // JavaScript: The Definitive Guide Por omissão json_decode converte objetos JSON em objetos PHP. Conversão de objetos JSON para arrays PHP: A função json_decode pode ser usado com o segundo argumento true para converter objetos JSON em arrays associativos PHP $json = '{"titulo": "JavaScript: The Definitive Guide","autor": "David Flanagan", "edicao": 6' $livro = json_decode($json, true); echo $livro['titulo']; // JavaScript: The Definitive Guide Nota: Se uma string JSON contém um objeto JSON o nome e valor devem estar dentro de aspas. Plicas simples não são válidas: $json_errado = "{'nome': 'valor'"; $x = json_decode($json_errado) // null
json_encode() - Converte valores PHP em arrays ou objetos JSON $json = json_encode($value) $json = json_encode($value, JSON_FORCE_OBJECT) json_encode recebe um valor de um tipo PHP e converte-o numa string codificada em JSON. Esta função só trabalha com strings codificadas em UTF-8. Se a conversão tiver sucesso retorna uma string codificada em JSON, senão retorna FALSE. Exemplo de conversão de arrays não associativos PHP: <?php $arr = array(1, 3, 5); echo json_encode($arr); // [1, 3, 5] echo json_encode($arr, JSON_FORCE_OBJECT); // {"0":1, "1":3, "2":5?> Exemplo de conversão de arrays associativos PHP (produzem sempre objetos): <?php $arr = array('a' => 1, 'b' => 2, 'c' => 3); echo json_encode($arr); echo json_encode($arr, JSON_FORCE_OBJECT);?> // {"a":1,"b":2,"c":3 // {"a":1,"b":2,"c":3 Exemplo de conversão de objetos PHP para JSON: <?php class Employee { public $name = ''; public $age = ''; public $role = ''; $obj = new Employee(); $obj->name = 'Alex'; $obj->age = 24; $obj->role = 'PHP Developer'; echo json_encode($obj); // {"name":"alex","age":24,"role":"php Developer"?>
Exemplos Consideremos o recurso Musica representado numa Web Api pela classe Musica: public class Musica { public int MusicaId { get; set; public string Artista { get; set; public string Titulo { get; set; 1. Pedido http não autenticado ao Controlador Musicas de uma Aplicação Web API (consideremos que o Controlador Musicas não tem o filtro [Authorize]) Ação musicas do Controlador da aplicação PHP public function musicasaction() { $client = new Client('http:localhost:46346/api/musicas'); $client->setmethod(request::method_get); $body=$response->getbody(); $musicas=json::decode($body, true); return new ViewModel(array( 'arr' => $musicas, Vista musicas.php <?php $title = 'Musicas'; $this->headtitle($title);?> <h1><?php echo $this->escapehtml($title);?></h1> <table class="table"> <tr> <th>musicaid</th><th>artista</th><th>titulo</th> </tr> <?php foreach ($arr as $musica) :?> <tr> <td><?php echo $this->escapehtml($musica['musicaid']);?></td> <td><?php echo $this->escapehtml($musica['artista']);?></td> <td><?php echo $this->escapehtml($musica['titulo']);?></td> </tr> <?php endforeach;?> </table>
2. Pedido http autenticado ao Controlador Musicas de uma Aplicação Web API (consideremos que o Controlador Musicas tem o filtro [Authorize]) Ação musicas do Controlador da aplicação PHP public function musicasaction() { $client = new Client('http:localhost:46346/api/musicas'); $client->setmethod(request::method_get); if(!isset($_session)){ session_start(); $bearer_token = 'Bearer '. $_SESSION['access_token']; $client->setheaders(array( 'Authorization' => $bearer_token, $body=$response->getbody(); $musicas=json::decode($body, true); return new ViewModel(array( 'arr' => $musicas,
3. Pedido https autenticado ao Controlador Musicas de uma Aplicação Web API (consideremos que o Controlador Musicas tem o filtro [Authorize]) Ação musicas do Controlador da aplicação PHP public function musicasaction() { $client = new Client('https:localhost:44399/api/musicas'); $client->setmethod(request::method_get); if(!isset($_session)){ session_start(); $bearer_token = 'Bearer '. $_SESSION['access_token']; $client->setheaders(array( 'Authorization' => $bearer_token, $client->setoptions(['sslverifypeer' => false]); $body=$response->getbody(); $musicas=json::decode($body, true); return new ViewModel(array( 'arr' => $musicas,