Salvando dados da API no Mysql utilizando PHP puro.
A necessidade de consumir uma API está cada vez maior, seja porquê seu sistema disponibiliza partes para utilização assincrona, é feito em microservice, ou até mesmo porquê precisamos utilizar o service de terceiros (Ex. Pagseguro, Paypal, outros).
O objetivo deste tutorial é ensinar de forma mais básica sem utilizar-se de nenhuma biblioteca e/ou framework para fazer uma consulta do tipo GET a uma API externa que não possui autenticação.
Para nosso tutorial iremos utilizar o JSON abaixo:
[
{
"firstName": "Maike",
"lastName": "Oliveira",
"age": 25,
"address": {
"streetAddress": "Jacaraipe",
"city": "Serra",
"state": "ES",
"postalCode": 10021
},
"phoneNumbers": [
"(27) 99909-1904",
"(27) 3011-1312"
],
"companies": [
{
"cnpj": "20.828.298/0001-30",
"name": "MOC Soluções"
}
]
},
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
"phoneNumbers": [
"212 555-1234",
"646 555-4567"
],
"companies": [
{
"cnpj": "24.835.989/0001-11",
"name": "Other Consulting"
}
]
}
]
Pré-Requesitos:
Wamp, Xamp ou qualquer instalção com PHP 5.6 ou superior.
Procedimento:
Para iniciar iremos criar nosso projeto vazio chamado consulta-api, dentro dele criaremos um arquivo com o nome de index.php que inicalmente será responsável por todo o processo, conforme imagem abaixo.
Abra o arquivo index.php e vamos a codificação, a forma mais simples de buscar informações de uma rota GET sem autenticação no PHP é usando a função file_get_contents(). Esta função normalmente retorna um arquivo para uma string, neste caso estamos buscando este “arquivo” de uma rota que se encontra online na URL.
<?php
$url = "https://d5632d70-e911-4c1c-b94b-0f5b5c149c87.mock.pstmn.io/clients";
$content = file_get_contents($url);
echo $content;
Explicando o trecho de código, primeiramente criamos uma variável recebendo o valor da URL que será consultada, feito isto criaremos a uma segunda variável que receberá o resultado da consulta na URL chamada $content, o file_get_contents espera no mínimo um parâmetro obrigatório que é o local do arquivo que deseja transformar em string, em nosso caso a URL conforme mostrado no exemplo, e na útima linha acima.
Agora iremos converter esta string em Objetos com a função json_decode().
$result = json_decode($content);
var_dump($result);
Ao dar um var_dump no $result podemos ver que agora temos um array de objetos aninhados e não mais uma única string, conforme imagem abaixo.
Agora criaremos nossa estrutura de banco de dados mysql, neste caso optei por utilizar 4 tabelas (person, address, phones, companies) conforme estrutura abaixo:
create table address
(
id int auto_increment
primary key,
person_id int null,
streetAddress varchar(255) null,
city varchar(255) null,
state varchar(255) null,
postalCode varchar(255) null
);
create table persons
(
id int auto_increment
primary key,
firstName varchar(255) null,
lastName varchar(255) null,
age int null
);
create table phones
(
id int auto_increment
primary key,
person_id varchar(255) null,
number varchar(20) null
);
create table companies
(
id int auto_increment
primary key,
person_id int null,
cnpj varchar(18) null,
name varchar(255) null
);
Agora voltando ao PHP iremos efetuar a conexão com o banco de dados utilizando os códigos a seguir:
$mysql_host = 'localhost';
$mysql_db_name = 'importacao';
$mysql_user = 'root';
$mysql_password = '';
try
{
$PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);
}catch ( PDOException $e )
{
echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}
Acima atribuo os valores de configuração ao meu banco de dados como ip do host, nome do database, usuário e senha. Faremos uma conexão com PDO para segurança, envolvemos o código no try – catch para que se for retornar qualquer excessão teremos tratamento para retorno do erro.
Agora que já temos conexão com o banco de dados, e também possuímos nossos dados que buscamos na API podemos salvar em suas respsctivas tabelas, como temos depencias temos que seguir uma ordem de inserção e alimentação da chave estrageira, primeiro adicionaremos o Person depois as outras tabelas alimentando assim o person_id.
try {
$PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);
$sql = 'INSERT INTO persons (firstName, lastName, age) VALUES (:firstName, :lastName, :age)';
foreach ($result as $person) {
$stmt = $PDO->prepare($sql);
$stmt->bindParam(':firstName', $person->firstName);
$stmt->bindParam(':lastName', $person->lastName);
$stmt->bindParam(':age', $person->age);
$result = $stmt->execute();
echo 'ID de person cadastrado: ' . $PDO->lastInsertId() . "<br />";
}
} catch (PDOException $e) {
echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}
Aqui estamos adicionando todos persons e imprimindo o ID conforme print da tela a seguir.
Agora precisamos salvar as tabelas vinculadas a este registro lembrando de inserir seu person_id para consultas futuras conforme código abaixo:
try {
$PDO = new PDO('mysql:host=' . $mysql_host . ';dbname=' . $mysql_db_name, $mysql_user, $mysql_password);
$sqlPerson = 'INSERT INTO persons (firstName, lastName, age) VALUES (:firstName, :lastName, :age)';
$sqlAdrress = 'INSERT INTO address (person_id, streetAddress, city, state, postalCode) VALUES (:person_id, :streetAddress, :city, :state, :postalCode)';
$sqlPhone = 'INSERT INTO phones (person_id, number) VALUES (:person_id, :number)';
$sqlCompany = 'INSERT INTO companies (person_id, cnpj, name) VALUES (:person_id, :cnpj, :name)';
foreach ($result as $person) {
$stmt = $PDO->prepare($sqlPerson);
$stmt->bindParam(':firstName', $person->firstName);
$stmt->bindParam(':lastName', $person->lastName);
$stmt->bindParam(':age', $person->age);
$result = $stmt->execute();
$person_id = $PDO->lastInsertId();
$stmt = $PDO->prepare($sqlAdrress);
$stmt->bindParam(':person_id', $person_id);
$stmt->bindParam(':streetAddress', $person->address->streetAddress);
$stmt->bindParam(':city', $person->address->city);
$stmt->bindParam(':state', $person->address->state);
$stmt->bindParam(':postalCode', $person->address->postalCode);
$result = $stmt->execute();
foreach ($person->phoneNumbers as $number) {
$stmt = $PDO->prepare($sqlPhone);
$stmt->bindParam(':person_id', $person_id);
$stmt->bindParam(':number', $number);
$result = $stmt->execute();
}
foreach ($person->companies as $company) {
$stmt = $PDO->prepare($sqlCompany);
$stmt->bindParam(':person_id', $person_id);
$stmt->bindParam(':cnpj', $company->cnpj);
$stmt->bindParam(':name', $company->name);
$result = $stmt->execute();
}
echo 'ID de person cadastrado: ' . $PDO->lastInsertId() . "<br />";
}
} catch (PDOException $e) {
echo 'Erro ao conectar com o MySQL: ' . $e->getMessage();
}
Acima criamos uma query para cada inserção, efetuamos o insert do person, salvando o id do mesmo na variável person_id, adicionamos o endereço que é um registro 1*1 (um para um), fizemos um loop nos telefones e inserimos cada um deles vinculados ao person, e por último adicionamos as companies.
Observação: há diversas outras maneiras de efetuar todo este procedimento, utilizamos o PDO por ser a maneira mais habitual atualmente, neste artigo o foco não é organização de código por isto não foi citado em nenhum momento a separação do mesmo, sendo assim o objetivo que era pegar os dados de uma API sem autenticação e com method GET está concluída e bem sucedida conforme imagens abaixo: