Mostrando entradas con la etiqueta API. Mostrar todas las entradas
Mostrando entradas con la etiqueta API. Mostrar todas las entradas

LLamar a una API externa con Guzzle (peticiones https) en vez de usar CURL

Ejemplo mandando por POST, con auth básica y adjuntando un JSON:
composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client();
$url = "https://pepitoperez/llamar_api?api_key=qNPzVxxxxxX7rw9l";
$json_orig = '{"lead": {
"properties": [
{
"property": "email",
"value": "pepitoperez@gmail.com"
},
{
"property": "nif",
"value": "xxxx"
}
]
}
}';

$response = $client->post($url, [
   'headers' => ['Content-type' => 'application/json'],
   'auth' => [
     'aaaa',
     'bbbb'
],
   'body' => $json_orig,
]);

return $response;

IMPORTANTE: Guzzle no te devuelve el json (o la respuesta que sea) en $response, sino para acceder a la respuesta es: $response->getBody()

Acceder a una API y obtener los datos

En el controller:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
...
$resp = Http::get('https://mindicador.cl/api');
$moneda = $resp->json(); // aunque en realidad ya está en json, pero por si acaso
$resp2 = Http::get('https://jsonplaceholder.typicode.com/posts');
$posts = $resp2->json();
return view('home', compact('moneda', 'posts'));

Y luego ya en la view recorrerlo como un array

API ejemplo general

Crear un model para Student y una vez creado especificar $table y $fillable:
php artisan make:model Student

Crea también la migration para ese model:
php artisan make:migration create_students_table
Y en esa migration:
$table->string("nombre_completo");
$table->integer("anno");

php artisan migrate
desde el phpmyadmin mete algunos datos de pruebas en esa tabla creada

Crear un resource de respuesta:
php artisan make:resource StudentResource

Y en ese resource en app\Http\Resources\StudentResource.php cambiar la función toArray:
public function toArray($request)
{
// return parent::toArray($request);
return [
'id' => $this->id,
'firstname' => $this->firstname,
'lastname' => $this->lastname,
'email' => $this->email,
'password' => $this->password,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at
];
}

Crear el controllador de la API:
php artisan make:controller APIController

en APIController.php:
...
use App\Http\Resources\StudentResource;
...
public function store(Request $request) {
        $student = Student::create($request->all());
        return new StudentResource($student);
    }

    public function show() {
        $students = Student::all();
        return StudentResource::collection($students);
    }

    public function showbyid($id) {
        $student = Student::find($id);
        if ($student) {
            return new StudentResource($student);
        }
        else {
            return response()->json([
                "Error"=> "No existe registro con el id:".$id
            ],404);
        }
    }

    public function update(Request $request, $id) {
        $student = Student::find($id);
        if ($student) {
            $student->firstname = $request->firstname;
            $student->lastname = $request->lastname;
            $student->email = $request->email;
            $student->password = $request->password;
            $student->save();
            return new StudentResource($student);
        }
        else {
            return response()->json([
                "Error"=> "No existe registro con el id:".$id
            ],404);
        }
    }

    public function delete($id) {
        $student = Student::find($id);
        if ($student) {
            $student->delete();
            return new StudentResource($student);
        }
        else {
            return response()->json([
                "Error"=> "No existe registro con el id:".$id
            ],404);
        }
    }

En routes/api.php:
Route::post('/student', 'APIController@store');
Route::get('/student_get', 'APIController@show');
Route::get('/student_get/{id}', 'APIController@showbyid');
Route::put('/student_update/{id}', 'APIController@update');
Route::delete('/student_delete/{id}', 'APIController@delete');

Y ya desde el postman puedes hacer pruebas (antes tienes q arrancar el servidor con php artisan serve).

Si queremos más seguridad que solo usuarios registrados puedan atacar esa API entonces en la tabla Users añadir el campo api_token (hacerlo con migration),
rellenar ese campo con la clave que quieras asignar a cada usuario (por ejemplo: 9OVJZ1o4Hi)

Y en routes/api.php se pondría:
Route::middleware('auth:api')->get('/student_get', 'APIController@show');

Y para llamarlo desde el postman:
http://127.0.0.1:8000/api/student_get?api_token=9OVJZ1o4Hi
Y para chequearlo en el show de APIController.php
public function show(Request $request) {
   // dd($request->api_token);
   $userAux = User::where('api_token',$request->api_token)->get();

   if (count($userAux)>0) {
     $students = Student::all();
     return StudentResource::collection($students);
   }
   else {
     return "Clave de acceso incorrecta";
   }
}

Laravel: Crear API y probar con postman

Creamos un proyecto Laravel y creamos un model con su correspondiente seeder, controller, migrations y todo (el -a):
php artisan make:model Estudiante -a

En el método index de EstudianteController:
$arrEstud = Estudiante::all();
return $arrEstud;

En el método store de EstudianteController:
$arrAux = Estudiante::create($request->all());
return $arrAux;

El model Estudiante:
protected $fillable = ["nombre", "active"];

En el migrate que se haya creado añadimos:
$table->string("nombre")->nullable();
$table->boolean("active");

En routes/web.php:
Route::apiResource();

Ejecutar las migraciones para q se cree la BD:
php artisan migrate
Podemos lanzar el propio servidor desde la consola:
php artisan serve

Para probarlo descargar (si no lo tienes de antes) la App de postman (la extensión para Chrome ya ha quedado obsoleta).

Y desde el postman para hacer un GET sería:
http://127.0.0.1:8000/estudiantes

Para hacer un POST en el postman:
a) en la url poner POST y http://127.0.0.1:8000/estudiantes
b) en headers: Content-Type y application/json
c) en body -> raw -> JSON -> JSON
{
    "nombre": "Pepito Pérez",
    "active": true
}

Cómo Laravel por seguridad te obliga a que se envíe un CSRF cuando se hace post vamos a añadir esta url como excepción SOLO para estas pruebas con el postman.

Para ello ir al middleware de VerifyCsrfToken y añadir la excepción para estas pruebas:
protected $except = [
'http://127.0.0.1:8000/estudiantes'
];