Do not speak Portuguese? Translate this site with Google or Bing Translator
Construindo e consumindo uma API RESTful no Laravel PHP

Posted on: January 29, 2020 12:18 PM

Posted by: Renato

Categories: Variados PHP Laravel rest

Views: 3490

Pré-requisitos

  • PHP 7.1 ou superior
  • Compositor
  • MySql
  • Laravel 5.6 ou superior
  • Carteiro

Para acompanhar este tutorial, você deve ter um entendimento básico da linguagem PHP. É necessário conhecimento básico da estrutura do Laravel.

Entendendo nossa aplicação

Você criará uma API CRUD. CRUD significa criar, ler, atualizar e excluir. Nossa API terá os seguintes pontos de extremidade:

GET /api/studentsretornará todos os alunos e aceitará GETsolicitações.

GET /api/students/{id}retornará um registro de estudante fazendo referência a ele ide aceitará GETsolicitações.

POST /api/studentscriará um novo registro do aluno e aceitará POSTsolicitações.

PUT /api/students/{id}atualizará um registro de aluno existente fazendo referência a ele ide aceitará PUTsolicitações.

DELETE /api/students/{id}excluirá um registro do aluno fazendo referência a ele ide aceitará DELETEsolicitações.

O registro do aluno conterá apenas namecoursecomo detalhes. Quando terminar de desenvolver esses pontos de extremidade, você os usará para desenvolver um aplicativo real de registros de alunos que fará uso da API.

Configurar o aplicativo Laravel

Para começar, você precisa criar um aplicativo Laravel. Para fazer isso, você deve executar o seguinte comando no seu terminal:

aravel new api-project

Next, change your current directory to the root folder of the project:

$ cd api-project

Next, start up the Laravel server if it’s not already running:

$ php artisan serve

You will be able to visit your application on https://localhost:8000

Laravel default landing

Em seguida, crie um novo banco de dados para seu aplicativo executando:

$ mysql -uroot -p<br>

Você será solicitado a digitar sua senha do MySQL se tiver algum conjunto ao se autenticar no MySQL. Execute o seguinte para criar um novo banco de dados chamado api-project:

CREATE DATABASE `api-project`;
MySQL root in terminal

Podemos continuar criando um modelo junto com uma migração. Para fazer isso, você deve executar:

<br>$ php artisan make:model Student -m 

Um novo arquivo chamado Student.php será criado no diretório do aplicativo.

NOTA: Você precisará editar o arquivo para especificar a tabela do banco de dados com a qual gostaríamos de interagir e os campos que podem ser gravados:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $table = 'students';

    protected $fillable = ['name', 'course'];
}

Além disso, um arquivo de migração será criado no diretório banco de dados / migrações para gerar nossa tabela. Você precisará modificar o arquivo de migração para criar uma coluna para o nome e o curso que aceitará valores de sequência.
database/migrations

...
public function up()
{
    Schema::create('students', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('course');
        $table->timestamps();
    });
}
...

Em seguida, você pode abrir a pasta do projeto no seu editor de texto preferido e modificar o arquivo .env para inserir as credenciais apropriadas do banco de dados. Isso permitirá que o aplicativo se conecte corretamente ao banco de dados criado recentemente:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<your-database-name>
DB_USERNAME=<your-database-username>
DB_PASSWORD=<your-database-password>

Em seguida, você executará sua migração usando o seguinte comando:

$ php artisan migrate

Setup the Routes

Agora que temos o básico do aplicativo configurado, podemos criar um controlador que conterá os métodos para nossa API executando:

$ php artisan make:controller ApiController <br>

Você encontrará um novo arquivo chamado ApiController.php no diretório app \ http \ controllers. Em seguida, podemos adicionar os seguintes métodos: "ApiController.php in the app\http\controllers".

...
class ApiController extends Controller
{
    public function getAllStudents() {
      // logic to get all students goes here
    }

    public function createStudent(Request $request) {
      // logic to create a student record goes here
    }

    public function getStudent($id) {
      // logic to get a student record goes here
    }

    public function updateStudent(Request $request, $id) {
      // logic to update a student record goes here
    }

    public function deleteStudent ($id) {
      // logic to delete a student record goes here
    }
}


Prossiga para o diretório de rotas, abra o arquivo api.php e crie os terminais que farão referência aos métodos criados anteriormente no ApiController.

...
Route::get('students', 'ApiController@getAllStudents');
Route::get('students/{id}', 'ApiController@getStudent');
Route::post('students, 'ApiController@createStudent');
Route::put('students/{id}', 'ApiController@updateStudent');
Route::delete('students/{id}','ApiController@deleteStudent');

Note: All routes in api.php are prefixed with /api by default

Create a Student Record
Localize o método createStudent em nosso ApiController

public function createStudent(Request $request) {
  // logic to create a student record goes here
}

Usaremos a classe de solicitação do Laravel para buscar os dados passados para o terminal. O terminal também espera o nome do tipo string e o curso do tipo string. Quando buscarmos os dados com sucesso, os armazenaremos em nosso banco de dados.

...
use App\Student;

class ApiController extends Controller
{
  ...
  public function createStudent(Request $request) {
    $student = new Student;
    $student->name = $request->name;
    $student->course = $request->course;
    $student->save();

    return response()->json([
        "message" => "student record created"
    ], 201);
  }
  ...
}

O snippet acima importa o modelo de aluno que irá interagir com a tabela de alunos no banco de dados. No método createStudent, instanciamos um novo objeto Request no parâmetro method, seguido por um novo objeto Student. Por fim, para cada $ student-> a solicitação equivalente é buscada e salva. Se a operação for bem-sucedida, uma resposta JSON será enviada de volta ao usuário da API com o registro do aluno de mensagem criado e com o código de resposta 201. Esse método já está vinculado às APIs / estudantes, conforme definido anteriormente em nosso arquivo de rotas localizado em rotas / api.php:

...
Route::post('students, 'ApiController@createStudent');
...

Testing

Antes do teste, verifique se o aplicativo está em execução. Você pode usar o comando inbuilt como mencionado anteriormente:

$ php artisan serve

Ou você pode usar o Valet, que é uma boa ferramenta para criar um passe de proxy para todos os seus aplicativos PHP, fornecendo um domínio * .test ou * .dev para seus aplicativos testarem localmente.

Para testar esse terminal, abra o Postman e faça uma solicitação POST para http: // localhost: 8000 / api / students ou se você usar o Valet http: // <nome da pasta> / api / students. Selecione a opção form-data e transmita os seguintes valores, como mostrado na imagem abaixo:

Postman view of POST request

Funciona se retornar a mensagem de sucesso junto com o código de resposta 201. Agora tente adicionar mais alguns registros para preencher nosso banco de dados para a próxima tarefa.

Return all Student Records

Agora vamos visitar o método getAllStudents em nosso ApiController

public function getAllStudents() {
  // logic to get all students goes here
}

class ApiController extends Controller {   public function getAllStudents() {     $students = Student::get()->toJson(JSON_PRETTY_PRINT);     return response($students, 200);   }   ... }

A consulta eloquente termina com -> toJson (JSON_PRETTY_PRINT); que serializará o retorno de dados do objeto por eloquente em um JSON bem formatado. O JSON é retornado com o código de resposta 200.

Esse método já está vinculado à rota api / students, como definido anteriormente em nosso arquivo de rotas localizado em routes / api.php:

Route::get('students', 'ApiController@getAllStudents');

Postman view of GET request

Return a student record

Abra o Postman e faça uma solicitação GET para o / api / students / {id} terminal {id} pode ser o ID de um registro existente que você possa ter em seu banco de dados.

Postman view of GET request for a single record

Update a student record

NOTE: The format for the ternary operator is condition ? true : false

Para testar esse terminal, retorne os detalhes do registro do aluno com o ID 1, fazendo uma solicitação GET para / api / students / 1.

Postman view of GET request for a single record

Os seguintes registros foram retornados:

[
    {
        "id": 1,
        "name": "Michael Okoh",
        "course": "Computer Science",
        "created_at": "2019-02-08 14:11:17",
        "updated_at": "2019-02-08 14:11:17"
    }
]


Em seguida, alteremos o curso para “Engenharia de software”, fazendo uma solicitação de PUT para api / students / 1. Para fazer uma solicitação PUT, é necessário transmitir uma carga JSON via formulário-dados. Agora, vamos alterar o valor do nome para Trojan Okoh e, claro, o valor para Engenharia de Software.

{
    "name": "Trojan Okoh",
    "course": "Software Engineering"
}
Postman view for changing the form data type
Postman view of updated record
Postman view of GET request

Delete a Student Record

Para testar esse terminal, teremos que listar todos os registros que temos atualmente em nosso banco de dados, fazendo uma solicitação GET para o terminal / api / students.

Postman view of GET request


Em seguida, faremos uma solicitação DELETE para estudantes / {id}, em que {id} é o ID do registro que estamos solicitando que seja excluído. Para fins de teste, excluirei o registro com o ID 2.

Postman view of deleted record

Conclusion

Agora que você chegou ao final deste artigo, confirme o conteúdo de alguns arquivos importantes.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Student;

class ApiController extends Controller
{
    public function getAllStudents() {
      $students = Student::get()->toJson(JSON_PRETTY_PRINT);
      return response($students, 200);
    }

    public function createStudent(Request $request) {
      $student = new Student;
      $student->name = $request->name;
      $student->course = $request->course;
      $student->save();

      return response()->json([
        "message" => "student record created"
      ], 201);
    }

    public function getStudent($id) {
      if (Student::where('id', $id)->exists()) {
        $student = Student::where('id', $id)->get()->toJson(JSON_PRETTY_PRINT);
        return response($student, 200);
      } else {
        return response()->json([
          "message" => "Student not found"
        ], 404);
      }
    }

    public function updateStudent(Request $request, $id) {
      if (Student::where('id', $id)->exists()) {
        $student = Student::find($id);

        $student->name = is_null($request->name) ? $student->name : $request->name;
        $student->course = is_null($request->course) ? $student->course : $request->course;
        $student->save();

        return response()->json([
          "message" => "records updated successfully"
        ], 200);
      } else {
        return response()->json([
          "message" => "Student not found"
        ], 404);
      }
    }

    public function deleteStudent ($id) {
      if(Student::where('id', $id)->exists()) {
        $student = Student::find($id);
        $student->delete();

        return response()->json([
          "message" => "records deleted"
        ], 202);
      } else {
        return response()->json([
          "message" => "Student not found"
        ], 404);
      }
    }
}


routes\web.php

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('students', 'ApiController@getAllStudents');
Route::get('students/{id}', 'ApiController@getStudent');
Route::post('students, 'ApiController@createStudent');
Route::put('students/{id}', 'ApiController@updateStudent');
Route::delete('students/{id}', 'ApiController@deleteStudent');

app\Student.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $table = 'students';

    protected $fillable = ['name', 'course'];
}

Conseguimos criar uma API CRUD RESTful simples usando o Laravel. Este artigo abordou os conceitos básicos do assunto. Não cobri a validação de solicitação e a segurança da API, o que seria um ótimo próximo passo para você implementar.

Codigo para estudo: https://github.com/lucenarenato/API_RESTful_Laravel_PHP

Fonte: https://www.twilio.com/blog/building-and-consuming-a-restful-api-in-laravel-php


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email