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:
use Zend\Http\Client;
$client = new Client('http://example.org', array( 'maxredirects' => 0,
'timeout' => 30 ));
$response = $client->send();
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.
use Zend\Http\Client; $client = new Client();
$client->setUri('http://example.org'); $client->setOptions(array( 'maxredirects' => 0, 'timeout' => 30 )); $response = $client->send();
Também é possível fazer pedidos usando um objeto Zend\Http\Request
configurado:
use Zend\Http\Client; use Zend\Http\Request; $request = new Request();
$request->setUri('http://example.org'); $client = new Client();
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.
use Zend\Http\Client;
$client = new Client('http://example.org'); $response = $client->send();
Efetuar um pedido POST
use Zend\Http\Client;
$client = new Client('http://example.org'); // Performing a POST request
$client->setMethod('POST'); $response = $client->send();
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\Client; use Zend\Http\Request;$client = new Client('http://example.org'); // Performing a POST request
$client->setMethod(Request::METHOD_POST); $response = $client->send();
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
use Zend\Http\Client; $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 = ' . . ';
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); $response = $client->send(); 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; }
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
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); //
{"a":1,"b":2,"c":3}
echo json_encode($arr, JSON_FORCE_OBJECT); //
{"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);
$response = $client->send(); $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, )); $response = $client->send(); $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]); $response = $client->send();
$body=$response->getBody();
$musicas=Json::decode($body, true); return new ViewModel(array(
'arr' => $musicas, ));