• Nenhum resultado encontrado

Classe PHP Client. A classe Zend\Http\Client fornece uma interface para realizar pedidos HTTP.

N/A
N/A
Protected

Academic year: 2021

Share "Classe PHP Client. A classe Zend\Http\Client fornece uma interface para realizar pedidos HTTP."

Copied!
10
0
0

Texto

(1)

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();

(2)

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', ));

(3)

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 = ' . . ';

(4)

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; }

(5)

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

(6)

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

(7)

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"}

?>

(8)

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>

(9)

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, ));

(10)

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, ));

Referências

Documentos relacionados

Quando nos referimos ao diagnostico de hipocuprose, podem-se avaliar os teores de cobre nas pastagens ou os níveis encontrados nos tecidos dos animais, onde a primeira

Os fatores limitantes são aqueles que restringem no momento a implantação de mais agroindústrias na região, estes fatores entretanto, quando identificados pelos

Edital nº 07/2017 - Processo Seletivo para concessão de Auxílio-Alimentação aos estudantes matriculados nos cursos presenciais de Ensino Médio Integrado – turno Vespertino com

Se souberes que Allaah Allaah te criou para o adorares, então fica sabendo: que a adoração não é te criou para o adorares, então fica sabendo: que a adoração não é adoração

Serviço de Informação ao Cidadão (e-SIC) como sistema centralizado para o tratamento de pedidos de acesso à informação amparada pela Lei de Acesso (Lei 12.527/2011),

suas instâncias, nos termos deste regulamento. de eleição dos membros da sociedade civil para iores de dezoito anos, nas a) Os observadores, com direito à voz e

Depois de a Secretária Executiva Adjunta anunciar a presença do Doutor Clarindo Ferracioli, Prefeito do Município de Restinga, passou a palavra ao representante

Marcela Prudencio RG: 49.044.940-2 Professor PEB Infantil, regime efetivo na CEMEI “Antônio Maurí- cio da Silva” e Professor Educação Básica I, regime administrativo, nesta